diff --git a/VERSION b/VERSION index e940301f..150c208e 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,6 @@ -v9.4.2 +v9.5.0 + +v9.5.0 Bugfix composite keys in a GSI with no range key. Also, generated tests are only added when opted in via a new flag, instead of by default. v9.4.2 Add updated clientconfig to release diff --git a/main.go b/main.go index 631719c1..6d07d637 100644 --- a/main.go +++ b/main.go @@ -30,6 +30,7 @@ type config struct { clientLanguage *string clientOnly *bool dynamoOnly *bool + withTests *bool outputPath *string versionFlag *bool swaggerFile *string @@ -52,7 +53,6 @@ type config struct { var version string func main() { - conf := config{ swaggerFile: flag.String("file", "swagger.yml", "the spec file to use"), goPackageName: flag.String("go-package", "", "package of the generated go code"), @@ -63,6 +63,7 @@ func main() { clientLanguage: flag.String("client-language", "", "generate client code in specific language [go|js]"), dynamoOnly: flag.Bool("dynamo-only", false, "only generate dynamo code"), relativeDynamoPath: flag.String("dynamo-path", "", "path to generate dynamo code relative to go package path"), + withTests: flag.Bool("with-tests", false, "generate tests for the generated db code"), } flag.Parse() if *conf.versionFlag { @@ -110,7 +111,7 @@ func main() { } if conf.generateDynamo { - if err := generateDynamo(conf.dynamoPath, *conf.goPackageName, conf.goAbsolutePackagePath, *conf.relativeDynamoPath, *conf.outputPath, swaggerSpec); err != nil { + if err := generateDynamo(conf.dynamoPath, *conf.goPackageName, conf.goAbsolutePackagePath, *conf.relativeDynamoPath, *conf.outputPath, *conf.withTests, swaggerSpec); err != nil { log.Fatal(err.Error()) } } @@ -133,7 +134,6 @@ func generateGoModels(packageName, basePath, outputPath string, swaggerSpec spec return err } if err := models.Generate(packageName, basePath, outputPath, swaggerSpec); err != nil { - return fmt.Errorf("Error generating models: %s", err) } return nil @@ -157,7 +157,6 @@ func generateServer(goPackageName, basePath, outputPath string, swaggerSpec spec func generateTracing(basePath, outputPath string) error { if err := prepareDir(filepath.Join(basePath, "servertracing")); err != nil { - return err } @@ -170,11 +169,11 @@ func generateTracing(basePath, outputPath string) error { return nil } -func generateDynamo(dynamoPath, goPackageName, basePath, relativeDynamoPath, OutputPath string, swaggerSpec spec.Swagger) error { +func generateDynamo(dynamoPath, goPackageName, basePath, relativeDynamoPath, OutputPath string, withTests bool, swaggerSpec spec.Swagger) error { if err := prepareDir(dynamoPath); err != nil { return err } - if err := gendb.GenerateDB(goPackageName, basePath, OutputPath, &swaggerSpec, relativeDynamoPath); err != nil { + if err := gendb.GenerateDB(goPackageName, basePath, OutputPath, withTests, &swaggerSpec, relativeDynamoPath); err != nil { return fmt.Errorf("Failed to generate database: %s", err) } return nil @@ -210,7 +209,7 @@ func prepareDir(dir string) error { return fmt.Errorf("Could not remove directory: %s, error :%s", dir, err) } - if err := os.MkdirAll(dir, 0700); err != nil { + if err := os.MkdirAll(dir, 0o700); err != nil { if !os.IsExist(err.(*os.PathError)) { return fmt.Errorf("Could not create directory: %s, error: %s", dir, err) } diff --git a/samples/Makefile b/samples/Makefile index d7dbb255..72a637f4 100644 --- a/samples/Makefile +++ b/samples/Makefile @@ -10,34 +10,34 @@ TEST_DB_PKG := "./gen-go-db/server/db/dynamodb" generate: @echo $(TEST_PKGS) $(TEST_DB_PKG) - ../bin/wag -file ./swagger.yml -output-path ./gen-go-basic -js-path ./gen-js + ../bin/wag -with-tests -file ./swagger.yml -output-path ./gen-go-basic -js-path ./gen-js cd ./gen-js && jsdoc2md index.js types.js > ./README.md go generate -mod=mod ./gen-go-basic... - ../bin/wag -file ./deprecated.yml -output-path ./gen-go-deprecated -js-path ./gen-js-deprecated + ../bin/wag -with-tests -file ./deprecated.yml -output-path ./gen-go-deprecated -js-path ./gen-js-deprecated cd ./gen-js-deprecated && jsdoc2md index.js types.js > ./README.md go generate -mod=mod ./gen-go-deprecated... - ../bin/wag -file ./errors.yml -output-path ./gen-go-errors -js-path ./gen-js-errors + ../bin/wag -with-tests -file ./errors.yml -output-path ./gen-go-errors -js-path ./gen-js-errors cd ./gen-js-errors && jsdoc2md index.js types.js > ./README.md go generate -mod=mod ./gen-go-errors... - ../bin/wag -file ./nils.yml -output-path ./gen-go-nils -js-path ./gen-js-nils + ../bin/wag -with-tests -file ./nils.yml -output-path ./gen-go-nils -js-path ./gen-js-nils cd ./gen-js-nils && jsdoc2md index.js types.js > ./README.md go generate -mod=mod ./gen-go-nils... - ../bin/wag -file ./strings.yml -output-path ./gen-go-strings -js-path ./gen-js-strings + ../bin/wag -with-tests -file ./strings.yml -output-path ./gen-go-strings -js-path ./gen-js-strings cd ./gen-js-strings && jsdoc2md index.js types.js > ./README.md go generate -mod=mod ./gen-go-strings... - ../bin/wag -file ./blog.yml -output-path ./gen-go-blog -js-path ./gen-js-blog + ../bin/wag -with-tests -file ./blog.yml -output-path ./gen-go-blog -js-path ./gen-js-blog cd ./gen-js-blog && jsdoc2md index.js types.js > ./README.md go generate -mod=mod ./gen-go-nils... - ../bin/wag -file ./db.yml -output-path ./gen-go-db -js-path ./gen-js-db + ../bin/wag -with-tests -file ./db.yml -output-path ./gen-go-db -js-path ./gen-js-db cd ./gen-js-db && jsdoc2md index.js types.js > ./README.md go generate -mod=mod ./gen-go-db... - ../bin/wag -file ./swagger.yml -output-path ./gen-go-client-only -js-path ./gen-js-client-only --client-only + ../bin/wag -with-tests -file ./swagger.yml -output-path ./gen-go-client-only -js-path ./gen-js-client-only --client-only cd ./gen-js-client-only && jsdoc2md index.js types.js > ./README.md go generate -mod=mod ./gen-go-client-only... - ../bin/wag -file ./db.yml -output-path ./gen-go-db-only -dynamo-only + ../bin/wag -with-tests -file ./db.yml -output-path ./gen-go-db-only -dynamo-only go generate -mod=mod ./gen-go-db-only... - ../bin/wag -file ./db.yml -output-path ./gen-go-db-custom-path -js-path ./gen-js-db-custom-path -dynamo-path db + ../bin/wag -with-tests -file ./db.yml -output-path ./gen-go-db-custom-path -js-path ./gen-js-db-custom-path -dynamo-path db cd ./gen-js-db-custom-path && jsdoc2md index.js types.js > ./README.md go generate -mod=mod ./gen-go-db-custom-path... diff --git a/samples/db.yml b/samples/db.yml index 2f8d4fb6..cb4271b5 100644 --- a/samples/db.yml +++ b/samples/db.yml @@ -467,6 +467,10 @@ definitions: - AttributeName: name_version Properties: [ name, version ] Separator: ":" + # 3 part composite in a GSI + - AttributeName: name_branch_commit + Properties: [ name, branch, commit ] + Separator: "--" DynamoDB: KeySchema: - AttributeName: name_branch @@ -480,16 +484,25 @@ definitions: KeyType: HASH - AttributeName: date KeyType: RANGE + - IndexName: nameBranchCommit + Projection: + ProjectionType: ALL + KeySchema: + - AttributeName: name_branch_commit + KeyType: HASH type: object required: - name - branch - date + - commit properties: name: type: string branch: type: string + commit: + type: string version: type: integer date: diff --git a/samples/gen-go-basic/server/mock_controller.go b/samples/gen-go-basic/server/mock_controller.go index 3e123654..28c133a3 100644 --- a/samples/gen-go-basic/server/mock_controller.go +++ b/samples/gen-go-basic/server/mock_controller.go @@ -8,7 +8,7 @@ import ( context "context" reflect "reflect" - v9 "github.com/Clever/wag/samples/gen-go-basic/models/v9" + models "github.com/Clever/wag/samples/gen-go-basic/models/v9" gomock "github.com/golang/mock/gomock" ) @@ -36,10 +36,10 @@ func (m *MockController) EXPECT() *MockControllerMockRecorder { } // CreateBook mocks base method. -func (m *MockController) CreateBook(ctx context.Context, i *v9.Book) (*v9.Book, error) { +func (m *MockController) CreateBook(ctx context.Context, i *models.Book) (*models.Book, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "CreateBook", ctx, i) - ret0, _ := ret[0].(*v9.Book) + ret0, _ := ret[0].(*models.Book) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -51,10 +51,10 @@ func (mr *MockControllerMockRecorder) CreateBook(ctx, i interface{}) *gomock.Cal } // GetAuthors mocks base method. -func (m *MockController) GetAuthors(ctx context.Context, i *v9.GetAuthorsInput) (*v9.AuthorsResponse, string, error) { +func (m *MockController) GetAuthors(ctx context.Context, i *models.GetAuthorsInput) (*models.AuthorsResponse, string, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetAuthors", ctx, i) - ret0, _ := ret[0].(*v9.AuthorsResponse) + ret0, _ := ret[0].(*models.AuthorsResponse) ret1, _ := ret[1].(string) ret2, _ := ret[2].(error) return ret0, ret1, ret2 @@ -67,10 +67,10 @@ func (mr *MockControllerMockRecorder) GetAuthors(ctx, i interface{}) *gomock.Cal } // GetAuthorsWithPut mocks base method. -func (m *MockController) GetAuthorsWithPut(ctx context.Context, i *v9.GetAuthorsWithPutInput) (*v9.AuthorsResponse, string, error) { +func (m *MockController) GetAuthorsWithPut(ctx context.Context, i *models.GetAuthorsWithPutInput) (*models.AuthorsResponse, string, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetAuthorsWithPut", ctx, i) - ret0, _ := ret[0].(*v9.AuthorsResponse) + ret0, _ := ret[0].(*models.AuthorsResponse) ret1, _ := ret[1].(string) ret2, _ := ret[2].(error) return ret0, ret1, ret2 @@ -83,10 +83,10 @@ func (mr *MockControllerMockRecorder) GetAuthorsWithPut(ctx, i interface{}) *gom } // GetBookByID mocks base method. -func (m *MockController) GetBookByID(ctx context.Context, i *v9.GetBookByIDInput) (*v9.Book, error) { +func (m *MockController) GetBookByID(ctx context.Context, i *models.GetBookByIDInput) (*models.Book, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBookByID", ctx, i) - ret0, _ := ret[0].(*v9.Book) + ret0, _ := ret[0].(*models.Book) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -98,10 +98,10 @@ func (mr *MockControllerMockRecorder) GetBookByID(ctx, i interface{}) *gomock.Ca } // GetBookByID2 mocks base method. -func (m *MockController) GetBookByID2(ctx context.Context, id string) (*v9.Book, error) { +func (m *MockController) GetBookByID2(ctx context.Context, id string) (*models.Book, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBookByID2", ctx, id) - ret0, _ := ret[0].(*v9.Book) + ret0, _ := ret[0].(*models.Book) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -113,10 +113,10 @@ func (mr *MockControllerMockRecorder) GetBookByID2(ctx, id interface{}) *gomock. } // GetBooks mocks base method. -func (m *MockController) GetBooks(ctx context.Context, i *v9.GetBooksInput) ([]v9.Book, int64, error) { +func (m *MockController) GetBooks(ctx context.Context, i *models.GetBooksInput) ([]models.Book, int64, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBooks", ctx, i) - ret0, _ := ret[0].([]v9.Book) + ret0, _ := ret[0].([]models.Book) ret1, _ := ret[1].(int64) ret2, _ := ret[2].(error) return ret0, ret1, ret2 @@ -143,7 +143,7 @@ func (mr *MockControllerMockRecorder) HealthCheck(ctx interface{}) *gomock.Call } // LowercaseModelsTest mocks base method. -func (m *MockController) LowercaseModelsTest(ctx context.Context, i *v9.LowercaseModelsTestInput) error { +func (m *MockController) LowercaseModelsTest(ctx context.Context, i *models.LowercaseModelsTestInput) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "LowercaseModelsTest", ctx, i) ret0, _ := ret[0].(error) @@ -157,10 +157,10 @@ func (mr *MockControllerMockRecorder) LowercaseModelsTest(ctx, i interface{}) *g } // PutBook mocks base method. -func (m *MockController) PutBook(ctx context.Context, i *v9.Book) (*v9.Book, error) { +func (m *MockController) PutBook(ctx context.Context, i *models.Book) (*models.Book, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutBook", ctx, i) - ret0, _ := ret[0].(*v9.Book) + ret0, _ := ret[0].(*models.Book) ret1, _ := ret[1].(error) return ret0, ret1 } diff --git a/samples/gen-go-db-custom-path/db/dynamodb/deployment.go b/samples/gen-go-db-custom-path/db/dynamodb/deployment.go index 3fe2bd1c..c2a3db9d 100644 --- a/samples/gen-go-db-custom-path/db/dynamodb/deployment.go +++ b/samples/gen-go-db-custom-path/db/dynamodb/deployment.go @@ -634,7 +634,9 @@ func (t DeploymentTable) getDeploymentByVersion(ctx context.Context, version str return nil, err } if len(queryOutput.Items) == 0 { - return nil, db.ErrDeploymentByVersionNotFound{Version: version} + return nil, db.ErrDeploymentByVersionNotFound{ + Version: version, + } } var deployment models.Deployment diff --git a/samples/gen-go-db-custom-path/db/dynamodb/dynamodb.go b/samples/gen-go-db-custom-path/db/dynamodb/dynamodb.go index cebb46c1..227092f2 100644 --- a/samples/gen-go-db-custom-path/db/dynamodb/dynamodb.go +++ b/samples/gen-go-db-custom-path/db/dynamodb/dynamodb.go @@ -806,6 +806,11 @@ func (d DB) ScanNoRangeThingWithCompositeAttributessByNameVersionAndDate(ctx con return d.noRangeThingWithCompositeAttributesTable.scanNoRangeThingWithCompositeAttributessByNameVersionAndDate(ctx, input, fn) } +// GetNoRangeThingWithCompositeAttributesByNameBranchCommit retrieves a NoRangeThingWithCompositeAttributes from the database. +func (d DB) GetNoRangeThingWithCompositeAttributesByNameBranchCommit(ctx context.Context, name string, branch string, commit string) (*models.NoRangeThingWithCompositeAttributes, error) { + return d.noRangeThingWithCompositeAttributesTable.getNoRangeThingWithCompositeAttributesByNameBranchCommit(ctx, name, branch, commit) +} + // SaveSimpleThing saves a SimpleThing to the database. func (d DB) SaveSimpleThing(ctx context.Context, m models.SimpleThing) error { return d.simpleThingTable.saveSimpleThing(ctx, m) diff --git a/samples/gen-go-db-custom-path/db/dynamodb/norangethingwithcompositeattributes.go b/samples/gen-go-db-custom-path/db/dynamodb/norangethingwithcompositeattributes.go index 2fb63004..733f230a 100644 --- a/samples/gen-go-db-custom-path/db/dynamodb/norangethingwithcompositeattributes.go +++ b/samples/gen-go-db-custom-path/db/dynamodb/norangethingwithcompositeattributes.go @@ -37,6 +37,11 @@ type ddbNoRangeThingWithCompositeAttributesGSINameVersion struct { Date strfmt.DateTime `dynamodbav:"date"` } +// ddbNoRangeThingWithCompositeAttributesGSINameBranchCommit represents the nameBranchCommit GSI. +type ddbNoRangeThingWithCompositeAttributesGSINameBranchCommit struct { + NameBranchCommit string `dynamodbav:"name_branch_commit"` +} + // ddbNoRangeThingWithCompositeAttributes represents a NoRangeThingWithCompositeAttributes as stored in DynamoDB. type ddbNoRangeThingWithCompositeAttributes struct { models.NoRangeThingWithCompositeAttributes @@ -53,6 +58,10 @@ func (t NoRangeThingWithCompositeAttributesTable) create(ctx context.Context) er AttributeName: aws.String("name_branch"), AttributeType: aws.String("S"), }, + { + AttributeName: aws.String("name_branch_commit"), + AttributeType: aws.String("S"), + }, { AttributeName: aws.String("name_version"), AttributeType: aws.String("S"), @@ -85,6 +94,22 @@ func (t NoRangeThingWithCompositeAttributesTable) create(ctx context.Context) er WriteCapacityUnits: aws.Int64(t.WriteCapacityUnits), }, }, + { + IndexName: aws.String("nameBranchCommit"), + Projection: &dynamodb.Projection{ + ProjectionType: aws.String("ALL"), + }, + KeySchema: []*dynamodb.KeySchemaElement{ + { + AttributeName: aws.String("name_branch_commit"), + KeyType: aws.String(dynamodb.KeyTypeHash), + }, + }, + ProvisionedThroughput: &dynamodb.ProvisionedThroughput{ + ReadCapacityUnits: aws.Int64(t.ReadCapacityUnits), + WriteCapacityUnits: aws.Int64(t.WriteCapacityUnits), + }, + }, }, ProvisionedThroughput: &dynamodb.ProvisionedThroughput{ ReadCapacityUnits: aws.Int64(t.ReadCapacityUnits), @@ -385,6 +410,45 @@ func (t NoRangeThingWithCompositeAttributesTable) scanNoRangeThingWithCompositeA } return err } +func (t NoRangeThingWithCompositeAttributesTable) getNoRangeThingWithCompositeAttributesByNameBranchCommit(ctx context.Context, name string, branch string, commit string) (*models.NoRangeThingWithCompositeAttributes, error) { + queryInput := &dynamodb.QueryInput{ + TableName: aws.String(t.TableName), + IndexName: aws.String("nameBranchCommit"), + ExpressionAttributeNames: map[string]*string{ + "#NAME_BRANCH_COMMIT": aws.String("name_branch_commit"), + }, + ExpressionAttributeValues: map[string]*dynamodb.AttributeValue{ + ":nameBranchCommit": &dynamodb.AttributeValue{ + S: aws.String(fmt.Sprintf("%s--%s--%s", name, branch, commit)), + }, + }, + KeyConditionExpression: aws.String("#NAME_BRANCH_COMMIT = :nameBranchCommit"), + } + + queryOutput, err := t.DynamoDBAPI.QueryWithContext(ctx, queryInput) + if err != nil { + if aerr, ok := err.(awserr.Error); ok { + switch aerr.Code() { + case dynamodb.ErrCodeResourceNotFoundException: + return nil, fmt.Errorf("table or index not found: %s", t.TableName) + } + } + return nil, err + } + if len(queryOutput.Items) == 0 { + return nil, db.ErrNoRangeThingWithCompositeAttributesByNameBranchCommitNotFound{ + Name: name, + Branch: branch, + Commit: commit, + } + } + + var noRangeThingWithCompositeAttributes models.NoRangeThingWithCompositeAttributes + if err := decodeNoRangeThingWithCompositeAttributes(queryOutput.Items[0], &noRangeThingWithCompositeAttributes); err != nil { + return nil, err + } + return &noRangeThingWithCompositeAttributes, nil +} // encodeNoRangeThingWithCompositeAttributes encodes a NoRangeThingWithCompositeAttributes as a DynamoDB map of attribute values. func encodeNoRangeThingWithCompositeAttributes(m models.NoRangeThingWithCompositeAttributes) (map[string]*dynamodb.AttributeValue, error) { @@ -395,6 +459,15 @@ func encodeNoRangeThingWithCompositeAttributes(m models.NoRangeThingWithComposit return nil, err } // make sure composite attributes don't contain separator characters + if strings.Contains(*m.Branch, "--") { + return nil, fmt.Errorf("branch cannot contain '--': %s", *m.Branch) + } + if strings.Contains(*m.Commit, "--") { + return nil, fmt.Errorf("commit cannot contain '--': %s", *m.Commit) + } + if strings.Contains(*m.Name, "--") { + return nil, fmt.Errorf("name cannot contain '--': %s", *m.Name) + } if strings.Contains(*m.Name, ":") { return nil, fmt.Errorf("name cannot contain ':': %s", *m.Name) } @@ -424,6 +497,15 @@ func encodeNoRangeThingWithCompositeAttributes(m models.NoRangeThingWithComposit for k, v := range nameVersion { val[k] = v } + nameBranchCommit, err := dynamodbattribute.MarshalMap(ddbNoRangeThingWithCompositeAttributesGSINameBranchCommit{ + NameBranchCommit: fmt.Sprintf("%s--%s--%s", *m.Name, *m.Branch, *m.Commit), + }) + if err != nil { + return nil, err + } + for k, v := range nameBranchCommit { + val[k] = v + } return val, err } diff --git a/samples/gen-go-db-custom-path/db/dynamodb/thing.go b/samples/gen-go-db-custom-path/db/dynamodb/thing.go index 30523ad9..876ece2a 100644 --- a/samples/gen-go-db-custom-path/db/dynamodb/thing.go +++ b/samples/gen-go-db-custom-path/db/dynamodb/thing.go @@ -488,7 +488,9 @@ func (t ThingTable) getThingByID(ctx context.Context, id string) (*models.Thing, return nil, err } if len(queryOutput.Items) == 0 { - return nil, db.ErrThingByIDNotFound{ID: id} + return nil, db.ErrThingByIDNotFound{ + ID: id, + } } var thing models.Thing diff --git a/samples/gen-go-db-custom-path/db/dynamodb/thingwithadditionalattributes.go b/samples/gen-go-db-custom-path/db/dynamodb/thingwithadditionalattributes.go index c564fcc1..bf91c0f4 100644 --- a/samples/gen-go-db-custom-path/db/dynamodb/thingwithadditionalattributes.go +++ b/samples/gen-go-db-custom-path/db/dynamodb/thingwithadditionalattributes.go @@ -509,7 +509,9 @@ func (t ThingWithAdditionalAttributesTable) getThingWithAdditionalAttributesByID return nil, err } if len(queryOutput.Items) == 0 { - return nil, db.ErrThingWithAdditionalAttributesByIDNotFound{ID: id} + return nil, db.ErrThingWithAdditionalAttributesByIDNotFound{ + ID: id, + } } var thingWithAdditionalAttributes models.ThingWithAdditionalAttributes diff --git a/samples/gen-go-db-custom-path/db/interface.go b/samples/gen-go-db-custom-path/db/interface.go index 4f2f9d7b..4cfe6552 100644 --- a/samples/gen-go-db-custom-path/db/interface.go +++ b/samples/gen-go-db-custom-path/db/interface.go @@ -61,6 +61,8 @@ type Interface interface { GetNoRangeThingWithCompositeAttributessByNameVersionAndDate(ctx context.Context, input GetNoRangeThingWithCompositeAttributessByNameVersionAndDateInput, fn func(m *models.NoRangeThingWithCompositeAttributes, lastNoRangeThingWithCompositeAttributes bool) bool) error // ScanNoRangeThingWithCompositeAttributessByNameVersionAndDate runs a scan on the NameVersionAndDate index. ScanNoRangeThingWithCompositeAttributessByNameVersionAndDate(ctx context.Context, input ScanNoRangeThingWithCompositeAttributessByNameVersionAndDateInput, fn func(m *models.NoRangeThingWithCompositeAttributes, lastNoRangeThingWithCompositeAttributes bool) bool) error + // GetNoRangeThingWithCompositeAttributesByNameBranchCommit retrieves a NoRangeThingWithCompositeAttributes from the database. + GetNoRangeThingWithCompositeAttributesByNameBranchCommit(ctx context.Context, name string, branch string, commit string) (*models.NoRangeThingWithCompositeAttributes, error) // SaveSimpleThing saves a SimpleThing to the database. SaveSimpleThing(ctx context.Context, m models.SimpleThing) error @@ -705,6 +707,20 @@ type ScanNoRangeThingWithCompositeAttributessByNameVersionAndDateInput struct { Limiter *rate.Limiter } +// ErrNoRangeThingWithCompositeAttributesByNameBranchCommitNotFound is returned when the database fails to find a NoRangeThingWithCompositeAttributes. +type ErrNoRangeThingWithCompositeAttributesByNameBranchCommitNotFound struct { + Name string + Branch string + Commit string +} + +var _ error = ErrNoRangeThingWithCompositeAttributesByNameBranchCommitNotFound{} + +// Error returns a description of the error. +func (e ErrNoRangeThingWithCompositeAttributesByNameBranchCommitNotFound) Error() string { + return "could not find NoRangeThingWithCompositeAttributes" +} + // ErrNoRangeThingWithCompositeAttributesAlreadyExists is returned when trying to overwrite a NoRangeThingWithCompositeAttributes. type ErrNoRangeThingWithCompositeAttributesAlreadyExists struct { NameBranch string diff --git a/samples/gen-go-db-custom-path/db/mock_db.go b/samples/gen-go-db-custom-path/db/mock_db.go index f4d86d75..f9a2d1e1 100644 --- a/samples/gen-go-db-custom-path/db/mock_db.go +++ b/samples/gen-go-db-custom-path/db/mock_db.go @@ -559,6 +559,21 @@ func (mr *MockInterfaceMockRecorder) GetNoRangeThingWithCompositeAttributes(ctx, return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetNoRangeThingWithCompositeAttributes", reflect.TypeOf((*MockInterface)(nil).GetNoRangeThingWithCompositeAttributes), ctx, name, branch) } +// GetNoRangeThingWithCompositeAttributesByNameBranchCommit mocks base method. +func (m *MockInterface) GetNoRangeThingWithCompositeAttributesByNameBranchCommit(ctx context.Context, name, branch, commit string) (*v9.NoRangeThingWithCompositeAttributes, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetNoRangeThingWithCompositeAttributesByNameBranchCommit", ctx, name, branch, commit) + ret0, _ := ret[0].(*v9.NoRangeThingWithCompositeAttributes) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetNoRangeThingWithCompositeAttributesByNameBranchCommit indicates an expected call of GetNoRangeThingWithCompositeAttributesByNameBranchCommit. +func (mr *MockInterfaceMockRecorder) GetNoRangeThingWithCompositeAttributesByNameBranchCommit(ctx, name, branch, commit interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetNoRangeThingWithCompositeAttributesByNameBranchCommit", reflect.TypeOf((*MockInterface)(nil).GetNoRangeThingWithCompositeAttributesByNameBranchCommit), ctx, name, branch, commit) +} + // GetNoRangeThingWithCompositeAttributessByNameVersionAndDate mocks base method. func (m *MockInterface) GetNoRangeThingWithCompositeAttributessByNameVersionAndDate(ctx context.Context, input GetNoRangeThingWithCompositeAttributessByNameVersionAndDateInput, fn func(*v9.NoRangeThingWithCompositeAttributes, bool) bool) error { m.ctrl.T.Helper() diff --git a/samples/gen-go-db-custom-path/db/tests/tests.go b/samples/gen-go-db-custom-path/db/tests/tests.go index c52ea377..1108ff4e 100644 --- a/samples/gen-go-db-custom-path/db/tests/tests.go +++ b/samples/gen-go-db-custom-path/db/tests/tests.go @@ -56,6 +56,7 @@ func RunDBTests(t *testing.T, dbFactory func() db.Interface) { t.Run("DeleteNoRangeThingWithCompositeAttributes", DeleteNoRangeThingWithCompositeAttributes(dbFactory(), t)) t.Run("GetNoRangeThingWithCompositeAttributessByNameVersionAndDate", GetNoRangeThingWithCompositeAttributessByNameVersionAndDate(dbFactory(), t)) t.Run("ScanNoRangeThingWithCompositeAttributessByNameVersionAndDate", ScanNoRangeThingWithCompositeAttributessByNameVersionAndDate(dbFactory(), t)) + t.Run("GetNoRangeThingWithCompositeAttributesByNameBranchCommit", GetNoRangeThingWithCompositeAttributesByNameBranchCommit(dbFactory(), t)) t.Run("GetSimpleThing", GetSimpleThing(dbFactory(), t)) t.Run("ScanSimpleThings", ScanSimpleThings(dbFactory(), t)) t.Run("SaveSimpleThing", SaveSimpleThing(dbFactory(), t)) @@ -1980,6 +1981,7 @@ func GetNoRangeThingWithCompositeAttributes(s db.Interface, t *testing.T) func(t ctx := context.Background() m := models.NoRangeThingWithCompositeAttributes{ Branch: db.String("string1"), + Commit: db.String("string1"), Date: db.DateTime(mustTime("2018-03-11T15:04:01+07:00")), Name: db.String("string1"), Version: 1, @@ -2003,18 +2005,21 @@ func ScanNoRangeThingWithCompositeAttributess(d db.Interface, t *testing.T) func ctx := context.Background() require.Nil(t, d.SaveNoRangeThingWithCompositeAttributes(ctx, models.NoRangeThingWithCompositeAttributes{ Branch: db.String("string1"), + Commit: db.String("string1"), Date: db.DateTime(mustTime("2018-03-11T15:04:01+07:00")), Name: db.String("string1"), Version: 1, })) require.Nil(t, d.SaveNoRangeThingWithCompositeAttributes(ctx, models.NoRangeThingWithCompositeAttributes{ Branch: db.String("string2"), + Commit: db.String("string2"), Date: db.DateTime(mustTime("2018-03-11T15:04:02+07:00")), Name: db.String("string2"), Version: 2, })) require.Nil(t, d.SaveNoRangeThingWithCompositeAttributes(ctx, models.NoRangeThingWithCompositeAttributes{ Branch: db.String("string3"), + Commit: db.String("string3"), Date: db.DateTime(mustTime("2018-03-11T15:04:03+07:00")), Name: db.String("string3"), Version: 3, @@ -2024,18 +2029,21 @@ func ScanNoRangeThingWithCompositeAttributess(d db.Interface, t *testing.T) func expected := []models.NoRangeThingWithCompositeAttributes{ models.NoRangeThingWithCompositeAttributes{ Branch: db.String("string1"), + Commit: db.String("string1"), Date: db.DateTime(mustTime("2018-03-11T15:04:01+07:00")), Name: db.String("string1"), Version: 1, }, models.NoRangeThingWithCompositeAttributes{ Branch: db.String("string2"), + Commit: db.String("string2"), Date: db.DateTime(mustTime("2018-03-11T15:04:02+07:00")), Name: db.String("string2"), Version: 2, }, models.NoRangeThingWithCompositeAttributes{ Branch: db.String("string3"), + Commit: db.String("string3"), Date: db.DateTime(mustTime("2018-03-11T15:04:03+07:00")), Name: db.String("string3"), Version: 3, @@ -2118,6 +2126,7 @@ func SaveNoRangeThingWithCompositeAttributes(s db.Interface, t *testing.T) func( ctx := context.Background() m := models.NoRangeThingWithCompositeAttributes{ Branch: db.String("string1"), + Commit: db.String("string1"), Date: db.DateTime(mustTime("2018-03-11T15:04:01+07:00")), Name: db.String("string1"), Version: 1, @@ -2132,6 +2141,7 @@ func DeleteNoRangeThingWithCompositeAttributes(s db.Interface, t *testing.T) fun ctx := context.Background() m := models.NoRangeThingWithCompositeAttributes{ Branch: db.String("string1"), + Commit: db.String("string1"), Date: db.DateTime(mustTime("2018-03-11T15:04:01+07:00")), Name: db.String("string1"), Version: 1, @@ -2181,18 +2191,21 @@ func GetNoRangeThingWithCompositeAttributessByNameVersionAndDate(d db.Interface, Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:01+07:00")), Branch: db.String("string1"), + Commit: db.String("string1"), })) require.Nil(t, d.SaveNoRangeThingWithCompositeAttributes(ctx, models.NoRangeThingWithCompositeAttributes{ Name: db.String("string1"), Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:02+07:00")), Branch: db.String("string3"), + Commit: db.String("string3"), })) require.Nil(t, d.SaveNoRangeThingWithCompositeAttributes(ctx, models.NoRangeThingWithCompositeAttributes{ Name: db.String("string1"), Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:03+07:00")), Branch: db.String("string2"), + Commit: db.String("string2"), })) limit := int64(3) tests := []getNoRangeThingWithCompositeAttributessByNameVersionAndDateTest{ @@ -2214,18 +2227,21 @@ func GetNoRangeThingWithCompositeAttributessByNameVersionAndDate(d db.Interface, Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:01+07:00")), Branch: db.String("string1"), + Commit: db.String("string1"), }, models.NoRangeThingWithCompositeAttributes{ Name: db.String("string1"), Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:02+07:00")), Branch: db.String("string3"), + Commit: db.String("string3"), }, models.NoRangeThingWithCompositeAttributes{ Name: db.String("string1"), Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:03+07:00")), Branch: db.String("string2"), + Commit: db.String("string2"), }, }, err: nil, @@ -2249,18 +2265,21 @@ func GetNoRangeThingWithCompositeAttributessByNameVersionAndDate(d db.Interface, Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:03+07:00")), Branch: db.String("string2"), + Commit: db.String("string2"), }, models.NoRangeThingWithCompositeAttributes{ Name: db.String("string1"), Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:02+07:00")), Branch: db.String("string3"), + Commit: db.String("string3"), }, models.NoRangeThingWithCompositeAttributes{ Name: db.String("string1"), Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:01+07:00")), Branch: db.String("string1"), + Commit: db.String("string1"), }, }, err: nil, @@ -2279,6 +2298,7 @@ func GetNoRangeThingWithCompositeAttributessByNameVersionAndDate(d db.Interface, Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:01+07:00")), Branch: db.String("string1"), + Commit: db.String("string1"), }, }, }, @@ -2289,12 +2309,14 @@ func GetNoRangeThingWithCompositeAttributessByNameVersionAndDate(d db.Interface, Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:02+07:00")), Branch: db.String("string3"), + Commit: db.String("string3"), }, models.NoRangeThingWithCompositeAttributes{ Name: db.String("string1"), Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:03+07:00")), Branch: db.String("string2"), + Commit: db.String("string2"), }, }, err: nil, @@ -2313,6 +2335,7 @@ func GetNoRangeThingWithCompositeAttributessByNameVersionAndDate(d db.Interface, Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:03+07:00")), Branch: db.String("string2"), + Commit: db.String("string2"), }, Descending: true, }, @@ -2324,12 +2347,14 @@ func GetNoRangeThingWithCompositeAttributessByNameVersionAndDate(d db.Interface, Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:02+07:00")), Branch: db.String("string3"), + Commit: db.String("string3"), }, models.NoRangeThingWithCompositeAttributes{ Name: db.String("string1"), Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:01+07:00")), Branch: db.String("string1"), + Commit: db.String("string1"), }, }, err: nil, @@ -2353,12 +2378,14 @@ func GetNoRangeThingWithCompositeAttributessByNameVersionAndDate(d db.Interface, Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:02+07:00")), Branch: db.String("string3"), + Commit: db.String("string3"), }, models.NoRangeThingWithCompositeAttributes{ Name: db.String("string1"), Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:03+07:00")), Branch: db.String("string2"), + Commit: db.String("string2"), }, }, err: nil, @@ -2381,18 +2408,21 @@ func ScanNoRangeThingWithCompositeAttributessByNameVersionAndDate(d db.Interface Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:01+07:00")), Branch: db.String("string1"), + Commit: db.String("string1"), })) require.Nil(t, d.SaveNoRangeThingWithCompositeAttributes(ctx, models.NoRangeThingWithCompositeAttributes{ Name: db.String("string2"), Version: 2, Date: db.DateTime(mustTime("2018-03-11T15:04:02+07:00")), Branch: db.String("string2"), + Commit: db.String("string2"), })) require.Nil(t, d.SaveNoRangeThingWithCompositeAttributes(ctx, models.NoRangeThingWithCompositeAttributes{ Name: db.String("string3"), Version: 3, Date: db.DateTime(mustTime("2018-03-11T15:04:03+07:00")), Branch: db.String("string3"), + Commit: db.String("string3"), })) t.Run("basic", func(t *testing.T) { @@ -2402,18 +2432,21 @@ func ScanNoRangeThingWithCompositeAttributessByNameVersionAndDate(d db.Interface Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:01+07:00")), Branch: db.String("string1"), + Commit: db.String("string1"), }, models.NoRangeThingWithCompositeAttributes{ Name: db.String("string2"), Version: 2, Date: db.DateTime(mustTime("2018-03-11T15:04:02+07:00")), Branch: db.String("string2"), + Commit: db.String("string2"), }, models.NoRangeThingWithCompositeAttributes{ Name: db.String("string3"), Version: 3, Date: db.DateTime(mustTime("2018-03-11T15:04:03+07:00")), Branch: db.String("string3"), + Commit: db.String("string3"), }, } // Consistent read must be disabled when scaning a GSI. @@ -2495,6 +2528,31 @@ func ScanNoRangeThingWithCompositeAttributessByNameVersionAndDate(d db.Interface } } +func GetNoRangeThingWithCompositeAttributesByNameBranchCommit(s db.Interface, t *testing.T) func(t *testing.T) { + return func(t *testing.T) { + ctx := context.Background() + m := models.NoRangeThingWithCompositeAttributes{ + Branch: db.String("string1"), + Commit: db.String("string1"), + Date: db.DateTime(mustTime("2018-03-11T15:04:01+07:00")), + Name: db.String("string1"), + Version: 1, + } + require.Nil(t, s.SaveNoRangeThingWithCompositeAttributes(ctx, m)) + m2, err := s.GetNoRangeThingWithCompositeAttributesByNameBranchCommit(ctx, *m.Name, *m.Branch, *m.Commit) + require.Nil(t, err) + require.Equal(t, m.Branch, m2.Branch) + require.Equal(t, m.Commit, m2.Commit) + require.Equal(t, m.Date.String(), m2.Date.String()) + require.Equal(t, m.Name, m2.Name) + require.Equal(t, m.Version, m2.Version) + + _, err = s.GetNoRangeThingWithCompositeAttributesByNameBranchCommit(ctx, "string2", "string2", "string2") + require.NotNil(t, err) + require.IsType(t, err, db.ErrNoRangeThingWithCompositeAttributesByNameBranchCommitNotFound{}) + } +} + func GetSimpleThing(s db.Interface, t *testing.T) func(t *testing.T) { return func(t *testing.T) { ctx := context.Background() diff --git a/samples/gen-go-db-custom-path/models/no_range_thing_with_composite_attributes.go b/samples/gen-go-db-custom-path/models/no_range_thing_with_composite_attributes.go index 1ff49eaa..20e79f66 100644 --- a/samples/gen-go-db-custom-path/models/no_range_thing_with_composite_attributes.go +++ b/samples/gen-go-db-custom-path/models/no_range_thing_with_composite_attributes.go @@ -21,6 +21,10 @@ type NoRangeThingWithCompositeAttributes struct { // Required: true Branch *string `json:"branch"` + // commit + // Required: true + Commit *string `json:"commit"` + // date // Required: true // Format: date-time @@ -42,6 +46,10 @@ func (m *NoRangeThingWithCompositeAttributes) Validate(formats strfmt.Registry) res = append(res, err) } + if err := m.validateCommit(formats); err != nil { + res = append(res, err) + } + if err := m.validateDate(formats); err != nil { res = append(res, err) } @@ -65,6 +73,15 @@ func (m *NoRangeThingWithCompositeAttributes) validateBranch(formats strfmt.Regi return nil } +func (m *NoRangeThingWithCompositeAttributes) validateCommit(formats strfmt.Registry) error { + + if err := validate.Required("commit", "body", m.Commit); err != nil { + return err + } + + return nil +} + func (m *NoRangeThingWithCompositeAttributes) validateDate(formats strfmt.Registry) error { if err := validate.Required("date", "body", m.Date); err != nil { diff --git a/samples/gen-go-db-only/db/dynamodb/deployment.go b/samples/gen-go-db-only/db/dynamodb/deployment.go index a1c0e122..81ec7718 100644 --- a/samples/gen-go-db-only/db/dynamodb/deployment.go +++ b/samples/gen-go-db-only/db/dynamodb/deployment.go @@ -634,7 +634,9 @@ func (t DeploymentTable) getDeploymentByVersion(ctx context.Context, version str return nil, err } if len(queryOutput.Items) == 0 { - return nil, db.ErrDeploymentByVersionNotFound{Version: version} + return nil, db.ErrDeploymentByVersionNotFound{ + Version: version, + } } var deployment models.Deployment diff --git a/samples/gen-go-db-only/db/dynamodb/dynamodb.go b/samples/gen-go-db-only/db/dynamodb/dynamodb.go index d5cab8cd..ee351f5b 100644 --- a/samples/gen-go-db-only/db/dynamodb/dynamodb.go +++ b/samples/gen-go-db-only/db/dynamodb/dynamodb.go @@ -806,6 +806,11 @@ func (d DB) ScanNoRangeThingWithCompositeAttributessByNameVersionAndDate(ctx con return d.noRangeThingWithCompositeAttributesTable.scanNoRangeThingWithCompositeAttributessByNameVersionAndDate(ctx, input, fn) } +// GetNoRangeThingWithCompositeAttributesByNameBranchCommit retrieves a NoRangeThingWithCompositeAttributes from the database. +func (d DB) GetNoRangeThingWithCompositeAttributesByNameBranchCommit(ctx context.Context, name string, branch string, commit string) (*models.NoRangeThingWithCompositeAttributes, error) { + return d.noRangeThingWithCompositeAttributesTable.getNoRangeThingWithCompositeAttributesByNameBranchCommit(ctx, name, branch, commit) +} + // SaveSimpleThing saves a SimpleThing to the database. func (d DB) SaveSimpleThing(ctx context.Context, m models.SimpleThing) error { return d.simpleThingTable.saveSimpleThing(ctx, m) diff --git a/samples/gen-go-db-only/db/dynamodb/norangethingwithcompositeattributes.go b/samples/gen-go-db-only/db/dynamodb/norangethingwithcompositeattributes.go index 2c8c2547..acbaece2 100644 --- a/samples/gen-go-db-only/db/dynamodb/norangethingwithcompositeattributes.go +++ b/samples/gen-go-db-only/db/dynamodb/norangethingwithcompositeattributes.go @@ -37,6 +37,11 @@ type ddbNoRangeThingWithCompositeAttributesGSINameVersion struct { Date strfmt.DateTime `dynamodbav:"date"` } +// ddbNoRangeThingWithCompositeAttributesGSINameBranchCommit represents the nameBranchCommit GSI. +type ddbNoRangeThingWithCompositeAttributesGSINameBranchCommit struct { + NameBranchCommit string `dynamodbav:"name_branch_commit"` +} + // ddbNoRangeThingWithCompositeAttributes represents a NoRangeThingWithCompositeAttributes as stored in DynamoDB. type ddbNoRangeThingWithCompositeAttributes struct { models.NoRangeThingWithCompositeAttributes @@ -53,6 +58,10 @@ func (t NoRangeThingWithCompositeAttributesTable) create(ctx context.Context) er AttributeName: aws.String("name_branch"), AttributeType: aws.String("S"), }, + { + AttributeName: aws.String("name_branch_commit"), + AttributeType: aws.String("S"), + }, { AttributeName: aws.String("name_version"), AttributeType: aws.String("S"), @@ -85,6 +94,22 @@ func (t NoRangeThingWithCompositeAttributesTable) create(ctx context.Context) er WriteCapacityUnits: aws.Int64(t.WriteCapacityUnits), }, }, + { + IndexName: aws.String("nameBranchCommit"), + Projection: &dynamodb.Projection{ + ProjectionType: aws.String("ALL"), + }, + KeySchema: []*dynamodb.KeySchemaElement{ + { + AttributeName: aws.String("name_branch_commit"), + KeyType: aws.String(dynamodb.KeyTypeHash), + }, + }, + ProvisionedThroughput: &dynamodb.ProvisionedThroughput{ + ReadCapacityUnits: aws.Int64(t.ReadCapacityUnits), + WriteCapacityUnits: aws.Int64(t.WriteCapacityUnits), + }, + }, }, ProvisionedThroughput: &dynamodb.ProvisionedThroughput{ ReadCapacityUnits: aws.Int64(t.ReadCapacityUnits), @@ -385,6 +410,45 @@ func (t NoRangeThingWithCompositeAttributesTable) scanNoRangeThingWithCompositeA } return err } +func (t NoRangeThingWithCompositeAttributesTable) getNoRangeThingWithCompositeAttributesByNameBranchCommit(ctx context.Context, name string, branch string, commit string) (*models.NoRangeThingWithCompositeAttributes, error) { + queryInput := &dynamodb.QueryInput{ + TableName: aws.String(t.TableName), + IndexName: aws.String("nameBranchCommit"), + ExpressionAttributeNames: map[string]*string{ + "#NAME_BRANCH_COMMIT": aws.String("name_branch_commit"), + }, + ExpressionAttributeValues: map[string]*dynamodb.AttributeValue{ + ":nameBranchCommit": &dynamodb.AttributeValue{ + S: aws.String(fmt.Sprintf("%s--%s--%s", name, branch, commit)), + }, + }, + KeyConditionExpression: aws.String("#NAME_BRANCH_COMMIT = :nameBranchCommit"), + } + + queryOutput, err := t.DynamoDBAPI.QueryWithContext(ctx, queryInput) + if err != nil { + if aerr, ok := err.(awserr.Error); ok { + switch aerr.Code() { + case dynamodb.ErrCodeResourceNotFoundException: + return nil, fmt.Errorf("table or index not found: %s", t.TableName) + } + } + return nil, err + } + if len(queryOutput.Items) == 0 { + return nil, db.ErrNoRangeThingWithCompositeAttributesByNameBranchCommitNotFound{ + Name: name, + Branch: branch, + Commit: commit, + } + } + + var noRangeThingWithCompositeAttributes models.NoRangeThingWithCompositeAttributes + if err := decodeNoRangeThingWithCompositeAttributes(queryOutput.Items[0], &noRangeThingWithCompositeAttributes); err != nil { + return nil, err + } + return &noRangeThingWithCompositeAttributes, nil +} // encodeNoRangeThingWithCompositeAttributes encodes a NoRangeThingWithCompositeAttributes as a DynamoDB map of attribute values. func encodeNoRangeThingWithCompositeAttributes(m models.NoRangeThingWithCompositeAttributes) (map[string]*dynamodb.AttributeValue, error) { @@ -395,6 +459,15 @@ func encodeNoRangeThingWithCompositeAttributes(m models.NoRangeThingWithComposit return nil, err } // make sure composite attributes don't contain separator characters + if strings.Contains(*m.Branch, "--") { + return nil, fmt.Errorf("branch cannot contain '--': %s", *m.Branch) + } + if strings.Contains(*m.Commit, "--") { + return nil, fmt.Errorf("commit cannot contain '--': %s", *m.Commit) + } + if strings.Contains(*m.Name, "--") { + return nil, fmt.Errorf("name cannot contain '--': %s", *m.Name) + } if strings.Contains(*m.Name, ":") { return nil, fmt.Errorf("name cannot contain ':': %s", *m.Name) } @@ -424,6 +497,15 @@ func encodeNoRangeThingWithCompositeAttributes(m models.NoRangeThingWithComposit for k, v := range nameVersion { val[k] = v } + nameBranchCommit, err := dynamodbattribute.MarshalMap(ddbNoRangeThingWithCompositeAttributesGSINameBranchCommit{ + NameBranchCommit: fmt.Sprintf("%s--%s--%s", *m.Name, *m.Branch, *m.Commit), + }) + if err != nil { + return nil, err + } + for k, v := range nameBranchCommit { + val[k] = v + } return val, err } diff --git a/samples/gen-go-db-only/db/dynamodb/thing.go b/samples/gen-go-db-only/db/dynamodb/thing.go index 66d78c21..801f3fd3 100644 --- a/samples/gen-go-db-only/db/dynamodb/thing.go +++ b/samples/gen-go-db-only/db/dynamodb/thing.go @@ -488,7 +488,9 @@ func (t ThingTable) getThingByID(ctx context.Context, id string) (*models.Thing, return nil, err } if len(queryOutput.Items) == 0 { - return nil, db.ErrThingByIDNotFound{ID: id} + return nil, db.ErrThingByIDNotFound{ + ID: id, + } } var thing models.Thing diff --git a/samples/gen-go-db-only/db/dynamodb/thingwithadditionalattributes.go b/samples/gen-go-db-only/db/dynamodb/thingwithadditionalattributes.go index 7db3601b..810ba276 100644 --- a/samples/gen-go-db-only/db/dynamodb/thingwithadditionalattributes.go +++ b/samples/gen-go-db-only/db/dynamodb/thingwithadditionalattributes.go @@ -509,7 +509,9 @@ func (t ThingWithAdditionalAttributesTable) getThingWithAdditionalAttributesByID return nil, err } if len(queryOutput.Items) == 0 { - return nil, db.ErrThingWithAdditionalAttributesByIDNotFound{ID: id} + return nil, db.ErrThingWithAdditionalAttributesByIDNotFound{ + ID: id, + } } var thingWithAdditionalAttributes models.ThingWithAdditionalAttributes diff --git a/samples/gen-go-db-only/db/interface.go b/samples/gen-go-db-only/db/interface.go index 487a0a76..3d5f1984 100644 --- a/samples/gen-go-db-only/db/interface.go +++ b/samples/gen-go-db-only/db/interface.go @@ -61,6 +61,8 @@ type Interface interface { GetNoRangeThingWithCompositeAttributessByNameVersionAndDate(ctx context.Context, input GetNoRangeThingWithCompositeAttributessByNameVersionAndDateInput, fn func(m *models.NoRangeThingWithCompositeAttributes, lastNoRangeThingWithCompositeAttributes bool) bool) error // ScanNoRangeThingWithCompositeAttributessByNameVersionAndDate runs a scan on the NameVersionAndDate index. ScanNoRangeThingWithCompositeAttributessByNameVersionAndDate(ctx context.Context, input ScanNoRangeThingWithCompositeAttributessByNameVersionAndDateInput, fn func(m *models.NoRangeThingWithCompositeAttributes, lastNoRangeThingWithCompositeAttributes bool) bool) error + // GetNoRangeThingWithCompositeAttributesByNameBranchCommit retrieves a NoRangeThingWithCompositeAttributes from the database. + GetNoRangeThingWithCompositeAttributesByNameBranchCommit(ctx context.Context, name string, branch string, commit string) (*models.NoRangeThingWithCompositeAttributes, error) // SaveSimpleThing saves a SimpleThing to the database. SaveSimpleThing(ctx context.Context, m models.SimpleThing) error @@ -705,6 +707,20 @@ type ScanNoRangeThingWithCompositeAttributessByNameVersionAndDateInput struct { Limiter *rate.Limiter } +// ErrNoRangeThingWithCompositeAttributesByNameBranchCommitNotFound is returned when the database fails to find a NoRangeThingWithCompositeAttributes. +type ErrNoRangeThingWithCompositeAttributesByNameBranchCommitNotFound struct { + Name string + Branch string + Commit string +} + +var _ error = ErrNoRangeThingWithCompositeAttributesByNameBranchCommitNotFound{} + +// Error returns a description of the error. +func (e ErrNoRangeThingWithCompositeAttributesByNameBranchCommitNotFound) Error() string { + return "could not find NoRangeThingWithCompositeAttributes" +} + // ErrNoRangeThingWithCompositeAttributesAlreadyExists is returned when trying to overwrite a NoRangeThingWithCompositeAttributes. type ErrNoRangeThingWithCompositeAttributesAlreadyExists struct { NameBranch string diff --git a/samples/gen-go-db-only/db/mock_db.go b/samples/gen-go-db-only/db/mock_db.go index fff7d412..9a248414 100644 --- a/samples/gen-go-db-only/db/mock_db.go +++ b/samples/gen-go-db-only/db/mock_db.go @@ -559,6 +559,21 @@ func (mr *MockInterfaceMockRecorder) GetNoRangeThingWithCompositeAttributes(ctx, return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetNoRangeThingWithCompositeAttributes", reflect.TypeOf((*MockInterface)(nil).GetNoRangeThingWithCompositeAttributes), ctx, name, branch) } +// GetNoRangeThingWithCompositeAttributesByNameBranchCommit mocks base method. +func (m *MockInterface) GetNoRangeThingWithCompositeAttributesByNameBranchCommit(ctx context.Context, name, branch, commit string) (*v9.NoRangeThingWithCompositeAttributes, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetNoRangeThingWithCompositeAttributesByNameBranchCommit", ctx, name, branch, commit) + ret0, _ := ret[0].(*v9.NoRangeThingWithCompositeAttributes) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetNoRangeThingWithCompositeAttributesByNameBranchCommit indicates an expected call of GetNoRangeThingWithCompositeAttributesByNameBranchCommit. +func (mr *MockInterfaceMockRecorder) GetNoRangeThingWithCompositeAttributesByNameBranchCommit(ctx, name, branch, commit interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetNoRangeThingWithCompositeAttributesByNameBranchCommit", reflect.TypeOf((*MockInterface)(nil).GetNoRangeThingWithCompositeAttributesByNameBranchCommit), ctx, name, branch, commit) +} + // GetNoRangeThingWithCompositeAttributessByNameVersionAndDate mocks base method. func (m *MockInterface) GetNoRangeThingWithCompositeAttributessByNameVersionAndDate(ctx context.Context, input GetNoRangeThingWithCompositeAttributessByNameVersionAndDateInput, fn func(*v9.NoRangeThingWithCompositeAttributes, bool) bool) error { m.ctrl.T.Helper() diff --git a/samples/gen-go-db-only/db/tests/tests.go b/samples/gen-go-db-only/db/tests/tests.go index ebf16acf..e35c0bbf 100644 --- a/samples/gen-go-db-only/db/tests/tests.go +++ b/samples/gen-go-db-only/db/tests/tests.go @@ -56,6 +56,7 @@ func RunDBTests(t *testing.T, dbFactory func() db.Interface) { t.Run("DeleteNoRangeThingWithCompositeAttributes", DeleteNoRangeThingWithCompositeAttributes(dbFactory(), t)) t.Run("GetNoRangeThingWithCompositeAttributessByNameVersionAndDate", GetNoRangeThingWithCompositeAttributessByNameVersionAndDate(dbFactory(), t)) t.Run("ScanNoRangeThingWithCompositeAttributessByNameVersionAndDate", ScanNoRangeThingWithCompositeAttributessByNameVersionAndDate(dbFactory(), t)) + t.Run("GetNoRangeThingWithCompositeAttributesByNameBranchCommit", GetNoRangeThingWithCompositeAttributesByNameBranchCommit(dbFactory(), t)) t.Run("GetSimpleThing", GetSimpleThing(dbFactory(), t)) t.Run("ScanSimpleThings", ScanSimpleThings(dbFactory(), t)) t.Run("SaveSimpleThing", SaveSimpleThing(dbFactory(), t)) @@ -1980,6 +1981,7 @@ func GetNoRangeThingWithCompositeAttributes(s db.Interface, t *testing.T) func(t ctx := context.Background() m := models.NoRangeThingWithCompositeAttributes{ Branch: db.String("string1"), + Commit: db.String("string1"), Date: db.DateTime(mustTime("2018-03-11T15:04:01+07:00")), Name: db.String("string1"), Version: 1, @@ -2003,18 +2005,21 @@ func ScanNoRangeThingWithCompositeAttributess(d db.Interface, t *testing.T) func ctx := context.Background() require.Nil(t, d.SaveNoRangeThingWithCompositeAttributes(ctx, models.NoRangeThingWithCompositeAttributes{ Branch: db.String("string1"), + Commit: db.String("string1"), Date: db.DateTime(mustTime("2018-03-11T15:04:01+07:00")), Name: db.String("string1"), Version: 1, })) require.Nil(t, d.SaveNoRangeThingWithCompositeAttributes(ctx, models.NoRangeThingWithCompositeAttributes{ Branch: db.String("string2"), + Commit: db.String("string2"), Date: db.DateTime(mustTime("2018-03-11T15:04:02+07:00")), Name: db.String("string2"), Version: 2, })) require.Nil(t, d.SaveNoRangeThingWithCompositeAttributes(ctx, models.NoRangeThingWithCompositeAttributes{ Branch: db.String("string3"), + Commit: db.String("string3"), Date: db.DateTime(mustTime("2018-03-11T15:04:03+07:00")), Name: db.String("string3"), Version: 3, @@ -2024,18 +2029,21 @@ func ScanNoRangeThingWithCompositeAttributess(d db.Interface, t *testing.T) func expected := []models.NoRangeThingWithCompositeAttributes{ models.NoRangeThingWithCompositeAttributes{ Branch: db.String("string1"), + Commit: db.String("string1"), Date: db.DateTime(mustTime("2018-03-11T15:04:01+07:00")), Name: db.String("string1"), Version: 1, }, models.NoRangeThingWithCompositeAttributes{ Branch: db.String("string2"), + Commit: db.String("string2"), Date: db.DateTime(mustTime("2018-03-11T15:04:02+07:00")), Name: db.String("string2"), Version: 2, }, models.NoRangeThingWithCompositeAttributes{ Branch: db.String("string3"), + Commit: db.String("string3"), Date: db.DateTime(mustTime("2018-03-11T15:04:03+07:00")), Name: db.String("string3"), Version: 3, @@ -2118,6 +2126,7 @@ func SaveNoRangeThingWithCompositeAttributes(s db.Interface, t *testing.T) func( ctx := context.Background() m := models.NoRangeThingWithCompositeAttributes{ Branch: db.String("string1"), + Commit: db.String("string1"), Date: db.DateTime(mustTime("2018-03-11T15:04:01+07:00")), Name: db.String("string1"), Version: 1, @@ -2132,6 +2141,7 @@ func DeleteNoRangeThingWithCompositeAttributes(s db.Interface, t *testing.T) fun ctx := context.Background() m := models.NoRangeThingWithCompositeAttributes{ Branch: db.String("string1"), + Commit: db.String("string1"), Date: db.DateTime(mustTime("2018-03-11T15:04:01+07:00")), Name: db.String("string1"), Version: 1, @@ -2181,18 +2191,21 @@ func GetNoRangeThingWithCompositeAttributessByNameVersionAndDate(d db.Interface, Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:01+07:00")), Branch: db.String("string1"), + Commit: db.String("string1"), })) require.Nil(t, d.SaveNoRangeThingWithCompositeAttributes(ctx, models.NoRangeThingWithCompositeAttributes{ Name: db.String("string1"), Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:02+07:00")), Branch: db.String("string3"), + Commit: db.String("string3"), })) require.Nil(t, d.SaveNoRangeThingWithCompositeAttributes(ctx, models.NoRangeThingWithCompositeAttributes{ Name: db.String("string1"), Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:03+07:00")), Branch: db.String("string2"), + Commit: db.String("string2"), })) limit := int64(3) tests := []getNoRangeThingWithCompositeAttributessByNameVersionAndDateTest{ @@ -2214,18 +2227,21 @@ func GetNoRangeThingWithCompositeAttributessByNameVersionAndDate(d db.Interface, Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:01+07:00")), Branch: db.String("string1"), + Commit: db.String("string1"), }, models.NoRangeThingWithCompositeAttributes{ Name: db.String("string1"), Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:02+07:00")), Branch: db.String("string3"), + Commit: db.String("string3"), }, models.NoRangeThingWithCompositeAttributes{ Name: db.String("string1"), Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:03+07:00")), Branch: db.String("string2"), + Commit: db.String("string2"), }, }, err: nil, @@ -2249,18 +2265,21 @@ func GetNoRangeThingWithCompositeAttributessByNameVersionAndDate(d db.Interface, Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:03+07:00")), Branch: db.String("string2"), + Commit: db.String("string2"), }, models.NoRangeThingWithCompositeAttributes{ Name: db.String("string1"), Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:02+07:00")), Branch: db.String("string3"), + Commit: db.String("string3"), }, models.NoRangeThingWithCompositeAttributes{ Name: db.String("string1"), Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:01+07:00")), Branch: db.String("string1"), + Commit: db.String("string1"), }, }, err: nil, @@ -2279,6 +2298,7 @@ func GetNoRangeThingWithCompositeAttributessByNameVersionAndDate(d db.Interface, Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:01+07:00")), Branch: db.String("string1"), + Commit: db.String("string1"), }, }, }, @@ -2289,12 +2309,14 @@ func GetNoRangeThingWithCompositeAttributessByNameVersionAndDate(d db.Interface, Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:02+07:00")), Branch: db.String("string3"), + Commit: db.String("string3"), }, models.NoRangeThingWithCompositeAttributes{ Name: db.String("string1"), Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:03+07:00")), Branch: db.String("string2"), + Commit: db.String("string2"), }, }, err: nil, @@ -2313,6 +2335,7 @@ func GetNoRangeThingWithCompositeAttributessByNameVersionAndDate(d db.Interface, Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:03+07:00")), Branch: db.String("string2"), + Commit: db.String("string2"), }, Descending: true, }, @@ -2324,12 +2347,14 @@ func GetNoRangeThingWithCompositeAttributessByNameVersionAndDate(d db.Interface, Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:02+07:00")), Branch: db.String("string3"), + Commit: db.String("string3"), }, models.NoRangeThingWithCompositeAttributes{ Name: db.String("string1"), Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:01+07:00")), Branch: db.String("string1"), + Commit: db.String("string1"), }, }, err: nil, @@ -2353,12 +2378,14 @@ func GetNoRangeThingWithCompositeAttributessByNameVersionAndDate(d db.Interface, Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:02+07:00")), Branch: db.String("string3"), + Commit: db.String("string3"), }, models.NoRangeThingWithCompositeAttributes{ Name: db.String("string1"), Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:03+07:00")), Branch: db.String("string2"), + Commit: db.String("string2"), }, }, err: nil, @@ -2381,18 +2408,21 @@ func ScanNoRangeThingWithCompositeAttributessByNameVersionAndDate(d db.Interface Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:01+07:00")), Branch: db.String("string1"), + Commit: db.String("string1"), })) require.Nil(t, d.SaveNoRangeThingWithCompositeAttributes(ctx, models.NoRangeThingWithCompositeAttributes{ Name: db.String("string2"), Version: 2, Date: db.DateTime(mustTime("2018-03-11T15:04:02+07:00")), Branch: db.String("string2"), + Commit: db.String("string2"), })) require.Nil(t, d.SaveNoRangeThingWithCompositeAttributes(ctx, models.NoRangeThingWithCompositeAttributes{ Name: db.String("string3"), Version: 3, Date: db.DateTime(mustTime("2018-03-11T15:04:03+07:00")), Branch: db.String("string3"), + Commit: db.String("string3"), })) t.Run("basic", func(t *testing.T) { @@ -2402,18 +2432,21 @@ func ScanNoRangeThingWithCompositeAttributessByNameVersionAndDate(d db.Interface Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:01+07:00")), Branch: db.String("string1"), + Commit: db.String("string1"), }, models.NoRangeThingWithCompositeAttributes{ Name: db.String("string2"), Version: 2, Date: db.DateTime(mustTime("2018-03-11T15:04:02+07:00")), Branch: db.String("string2"), + Commit: db.String("string2"), }, models.NoRangeThingWithCompositeAttributes{ Name: db.String("string3"), Version: 3, Date: db.DateTime(mustTime("2018-03-11T15:04:03+07:00")), Branch: db.String("string3"), + Commit: db.String("string3"), }, } // Consistent read must be disabled when scaning a GSI. @@ -2495,6 +2528,31 @@ func ScanNoRangeThingWithCompositeAttributessByNameVersionAndDate(d db.Interface } } +func GetNoRangeThingWithCompositeAttributesByNameBranchCommit(s db.Interface, t *testing.T) func(t *testing.T) { + return func(t *testing.T) { + ctx := context.Background() + m := models.NoRangeThingWithCompositeAttributes{ + Branch: db.String("string1"), + Commit: db.String("string1"), + Date: db.DateTime(mustTime("2018-03-11T15:04:01+07:00")), + Name: db.String("string1"), + Version: 1, + } + require.Nil(t, s.SaveNoRangeThingWithCompositeAttributes(ctx, m)) + m2, err := s.GetNoRangeThingWithCompositeAttributesByNameBranchCommit(ctx, *m.Name, *m.Branch, *m.Commit) + require.Nil(t, err) + require.Equal(t, m.Branch, m2.Branch) + require.Equal(t, m.Commit, m2.Commit) + require.Equal(t, m.Date.String(), m2.Date.String()) + require.Equal(t, m.Name, m2.Name) + require.Equal(t, m.Version, m2.Version) + + _, err = s.GetNoRangeThingWithCompositeAttributesByNameBranchCommit(ctx, "string2", "string2", "string2") + require.NotNil(t, err) + require.IsType(t, err, db.ErrNoRangeThingWithCompositeAttributesByNameBranchCommitNotFound{}) + } +} + func GetSimpleThing(s db.Interface, t *testing.T) func(t *testing.T) { return func(t *testing.T) { ctx := context.Background() diff --git a/samples/gen-go-db-only/models/no_range_thing_with_composite_attributes.go b/samples/gen-go-db-only/models/no_range_thing_with_composite_attributes.go index 1ff49eaa..20e79f66 100644 --- a/samples/gen-go-db-only/models/no_range_thing_with_composite_attributes.go +++ b/samples/gen-go-db-only/models/no_range_thing_with_composite_attributes.go @@ -21,6 +21,10 @@ type NoRangeThingWithCompositeAttributes struct { // Required: true Branch *string `json:"branch"` + // commit + // Required: true + Commit *string `json:"commit"` + // date // Required: true // Format: date-time @@ -42,6 +46,10 @@ func (m *NoRangeThingWithCompositeAttributes) Validate(formats strfmt.Registry) res = append(res, err) } + if err := m.validateCommit(formats); err != nil { + res = append(res, err) + } + if err := m.validateDate(formats); err != nil { res = append(res, err) } @@ -65,6 +73,15 @@ func (m *NoRangeThingWithCompositeAttributes) validateBranch(formats strfmt.Regi return nil } +func (m *NoRangeThingWithCompositeAttributes) validateCommit(formats strfmt.Registry) error { + + if err := validate.Required("commit", "body", m.Commit); err != nil { + return err + } + + return nil +} + func (m *NoRangeThingWithCompositeAttributes) validateDate(formats strfmt.Registry) error { if err := validate.Required("date", "body", m.Date); err != nil { diff --git a/samples/gen-go-db/models/no_range_thing_with_composite_attributes.go b/samples/gen-go-db/models/no_range_thing_with_composite_attributes.go index 1ff49eaa..20e79f66 100644 --- a/samples/gen-go-db/models/no_range_thing_with_composite_attributes.go +++ b/samples/gen-go-db/models/no_range_thing_with_composite_attributes.go @@ -21,6 +21,10 @@ type NoRangeThingWithCompositeAttributes struct { // Required: true Branch *string `json:"branch"` + // commit + // Required: true + Commit *string `json:"commit"` + // date // Required: true // Format: date-time @@ -42,6 +46,10 @@ func (m *NoRangeThingWithCompositeAttributes) Validate(formats strfmt.Registry) res = append(res, err) } + if err := m.validateCommit(formats); err != nil { + res = append(res, err) + } + if err := m.validateDate(formats); err != nil { res = append(res, err) } @@ -65,6 +73,15 @@ func (m *NoRangeThingWithCompositeAttributes) validateBranch(formats strfmt.Regi return nil } +func (m *NoRangeThingWithCompositeAttributes) validateCommit(formats strfmt.Registry) error { + + if err := validate.Required("commit", "body", m.Commit); err != nil { + return err + } + + return nil +} + func (m *NoRangeThingWithCompositeAttributes) validateDate(formats strfmt.Registry) error { if err := validate.Required("date", "body", m.Date); err != nil { diff --git a/samples/gen-go-db/server/db/dynamodb/deployment.go b/samples/gen-go-db/server/db/dynamodb/deployment.go index 88a7957d..3b1be0bf 100644 --- a/samples/gen-go-db/server/db/dynamodb/deployment.go +++ b/samples/gen-go-db/server/db/dynamodb/deployment.go @@ -634,7 +634,9 @@ func (t DeploymentTable) getDeploymentByVersion(ctx context.Context, version str return nil, err } if len(queryOutput.Items) == 0 { - return nil, db.ErrDeploymentByVersionNotFound{Version: version} + return nil, db.ErrDeploymentByVersionNotFound{ + Version: version, + } } var deployment models.Deployment diff --git a/samples/gen-go-db/server/db/dynamodb/dynamodb.go b/samples/gen-go-db/server/db/dynamodb/dynamodb.go index 26bfee06..8929d602 100644 --- a/samples/gen-go-db/server/db/dynamodb/dynamodb.go +++ b/samples/gen-go-db/server/db/dynamodb/dynamodb.go @@ -806,6 +806,11 @@ func (d DB) ScanNoRangeThingWithCompositeAttributessByNameVersionAndDate(ctx con return d.noRangeThingWithCompositeAttributesTable.scanNoRangeThingWithCompositeAttributessByNameVersionAndDate(ctx, input, fn) } +// GetNoRangeThingWithCompositeAttributesByNameBranchCommit retrieves a NoRangeThingWithCompositeAttributes from the database. +func (d DB) GetNoRangeThingWithCompositeAttributesByNameBranchCommit(ctx context.Context, name string, branch string, commit string) (*models.NoRangeThingWithCompositeAttributes, error) { + return d.noRangeThingWithCompositeAttributesTable.getNoRangeThingWithCompositeAttributesByNameBranchCommit(ctx, name, branch, commit) +} + // SaveSimpleThing saves a SimpleThing to the database. func (d DB) SaveSimpleThing(ctx context.Context, m models.SimpleThing) error { return d.simpleThingTable.saveSimpleThing(ctx, m) diff --git a/samples/gen-go-db/server/db/dynamodb/norangethingwithcompositeattributes.go b/samples/gen-go-db/server/db/dynamodb/norangethingwithcompositeattributes.go index 4d7e59a8..ddcc0a53 100644 --- a/samples/gen-go-db/server/db/dynamodb/norangethingwithcompositeattributes.go +++ b/samples/gen-go-db/server/db/dynamodb/norangethingwithcompositeattributes.go @@ -37,6 +37,11 @@ type ddbNoRangeThingWithCompositeAttributesGSINameVersion struct { Date strfmt.DateTime `dynamodbav:"date"` } +// ddbNoRangeThingWithCompositeAttributesGSINameBranchCommit represents the nameBranchCommit GSI. +type ddbNoRangeThingWithCompositeAttributesGSINameBranchCommit struct { + NameBranchCommit string `dynamodbav:"name_branch_commit"` +} + // ddbNoRangeThingWithCompositeAttributes represents a NoRangeThingWithCompositeAttributes as stored in DynamoDB. type ddbNoRangeThingWithCompositeAttributes struct { models.NoRangeThingWithCompositeAttributes @@ -53,6 +58,10 @@ func (t NoRangeThingWithCompositeAttributesTable) create(ctx context.Context) er AttributeName: aws.String("name_branch"), AttributeType: aws.String("S"), }, + { + AttributeName: aws.String("name_branch_commit"), + AttributeType: aws.String("S"), + }, { AttributeName: aws.String("name_version"), AttributeType: aws.String("S"), @@ -85,6 +94,22 @@ func (t NoRangeThingWithCompositeAttributesTable) create(ctx context.Context) er WriteCapacityUnits: aws.Int64(t.WriteCapacityUnits), }, }, + { + IndexName: aws.String("nameBranchCommit"), + Projection: &dynamodb.Projection{ + ProjectionType: aws.String("ALL"), + }, + KeySchema: []*dynamodb.KeySchemaElement{ + { + AttributeName: aws.String("name_branch_commit"), + KeyType: aws.String(dynamodb.KeyTypeHash), + }, + }, + ProvisionedThroughput: &dynamodb.ProvisionedThroughput{ + ReadCapacityUnits: aws.Int64(t.ReadCapacityUnits), + WriteCapacityUnits: aws.Int64(t.WriteCapacityUnits), + }, + }, }, ProvisionedThroughput: &dynamodb.ProvisionedThroughput{ ReadCapacityUnits: aws.Int64(t.ReadCapacityUnits), @@ -385,6 +410,45 @@ func (t NoRangeThingWithCompositeAttributesTable) scanNoRangeThingWithCompositeA } return err } +func (t NoRangeThingWithCompositeAttributesTable) getNoRangeThingWithCompositeAttributesByNameBranchCommit(ctx context.Context, name string, branch string, commit string) (*models.NoRangeThingWithCompositeAttributes, error) { + queryInput := &dynamodb.QueryInput{ + TableName: aws.String(t.TableName), + IndexName: aws.String("nameBranchCommit"), + ExpressionAttributeNames: map[string]*string{ + "#NAME_BRANCH_COMMIT": aws.String("name_branch_commit"), + }, + ExpressionAttributeValues: map[string]*dynamodb.AttributeValue{ + ":nameBranchCommit": &dynamodb.AttributeValue{ + S: aws.String(fmt.Sprintf("%s--%s--%s", name, branch, commit)), + }, + }, + KeyConditionExpression: aws.String("#NAME_BRANCH_COMMIT = :nameBranchCommit"), + } + + queryOutput, err := t.DynamoDBAPI.QueryWithContext(ctx, queryInput) + if err != nil { + if aerr, ok := err.(awserr.Error); ok { + switch aerr.Code() { + case dynamodb.ErrCodeResourceNotFoundException: + return nil, fmt.Errorf("table or index not found: %s", t.TableName) + } + } + return nil, err + } + if len(queryOutput.Items) == 0 { + return nil, db.ErrNoRangeThingWithCompositeAttributesByNameBranchCommitNotFound{ + Name: name, + Branch: branch, + Commit: commit, + } + } + + var noRangeThingWithCompositeAttributes models.NoRangeThingWithCompositeAttributes + if err := decodeNoRangeThingWithCompositeAttributes(queryOutput.Items[0], &noRangeThingWithCompositeAttributes); err != nil { + return nil, err + } + return &noRangeThingWithCompositeAttributes, nil +} // encodeNoRangeThingWithCompositeAttributes encodes a NoRangeThingWithCompositeAttributes as a DynamoDB map of attribute values. func encodeNoRangeThingWithCompositeAttributes(m models.NoRangeThingWithCompositeAttributes) (map[string]*dynamodb.AttributeValue, error) { @@ -395,6 +459,15 @@ func encodeNoRangeThingWithCompositeAttributes(m models.NoRangeThingWithComposit return nil, err } // make sure composite attributes don't contain separator characters + if strings.Contains(*m.Branch, "--") { + return nil, fmt.Errorf("branch cannot contain '--': %s", *m.Branch) + } + if strings.Contains(*m.Commit, "--") { + return nil, fmt.Errorf("commit cannot contain '--': %s", *m.Commit) + } + if strings.Contains(*m.Name, "--") { + return nil, fmt.Errorf("name cannot contain '--': %s", *m.Name) + } if strings.Contains(*m.Name, ":") { return nil, fmt.Errorf("name cannot contain ':': %s", *m.Name) } @@ -424,6 +497,15 @@ func encodeNoRangeThingWithCompositeAttributes(m models.NoRangeThingWithComposit for k, v := range nameVersion { val[k] = v } + nameBranchCommit, err := dynamodbattribute.MarshalMap(ddbNoRangeThingWithCompositeAttributesGSINameBranchCommit{ + NameBranchCommit: fmt.Sprintf("%s--%s--%s", *m.Name, *m.Branch, *m.Commit), + }) + if err != nil { + return nil, err + } + for k, v := range nameBranchCommit { + val[k] = v + } return val, err } diff --git a/samples/gen-go-db/server/db/dynamodb/thing.go b/samples/gen-go-db/server/db/dynamodb/thing.go index ea45d863..c4bb4c04 100644 --- a/samples/gen-go-db/server/db/dynamodb/thing.go +++ b/samples/gen-go-db/server/db/dynamodb/thing.go @@ -488,7 +488,9 @@ func (t ThingTable) getThingByID(ctx context.Context, id string) (*models.Thing, return nil, err } if len(queryOutput.Items) == 0 { - return nil, db.ErrThingByIDNotFound{ID: id} + return nil, db.ErrThingByIDNotFound{ + ID: id, + } } var thing models.Thing diff --git a/samples/gen-go-db/server/db/dynamodb/thingwithadditionalattributes.go b/samples/gen-go-db/server/db/dynamodb/thingwithadditionalattributes.go index a72d57c4..3d642cef 100644 --- a/samples/gen-go-db/server/db/dynamodb/thingwithadditionalattributes.go +++ b/samples/gen-go-db/server/db/dynamodb/thingwithadditionalattributes.go @@ -509,7 +509,9 @@ func (t ThingWithAdditionalAttributesTable) getThingWithAdditionalAttributesByID return nil, err } if len(queryOutput.Items) == 0 { - return nil, db.ErrThingWithAdditionalAttributesByIDNotFound{ID: id} + return nil, db.ErrThingWithAdditionalAttributesByIDNotFound{ + ID: id, + } } var thingWithAdditionalAttributes models.ThingWithAdditionalAttributes diff --git a/samples/gen-go-db/server/db/interface.go b/samples/gen-go-db/server/db/interface.go index bc0a5d73..1b34d128 100644 --- a/samples/gen-go-db/server/db/interface.go +++ b/samples/gen-go-db/server/db/interface.go @@ -61,6 +61,8 @@ type Interface interface { GetNoRangeThingWithCompositeAttributessByNameVersionAndDate(ctx context.Context, input GetNoRangeThingWithCompositeAttributessByNameVersionAndDateInput, fn func(m *models.NoRangeThingWithCompositeAttributes, lastNoRangeThingWithCompositeAttributes bool) bool) error // ScanNoRangeThingWithCompositeAttributessByNameVersionAndDate runs a scan on the NameVersionAndDate index. ScanNoRangeThingWithCompositeAttributessByNameVersionAndDate(ctx context.Context, input ScanNoRangeThingWithCompositeAttributessByNameVersionAndDateInput, fn func(m *models.NoRangeThingWithCompositeAttributes, lastNoRangeThingWithCompositeAttributes bool) bool) error + // GetNoRangeThingWithCompositeAttributesByNameBranchCommit retrieves a NoRangeThingWithCompositeAttributes from the database. + GetNoRangeThingWithCompositeAttributesByNameBranchCommit(ctx context.Context, name string, branch string, commit string) (*models.NoRangeThingWithCompositeAttributes, error) // SaveSimpleThing saves a SimpleThing to the database. SaveSimpleThing(ctx context.Context, m models.SimpleThing) error @@ -705,6 +707,20 @@ type ScanNoRangeThingWithCompositeAttributessByNameVersionAndDateInput struct { Limiter *rate.Limiter } +// ErrNoRangeThingWithCompositeAttributesByNameBranchCommitNotFound is returned when the database fails to find a NoRangeThingWithCompositeAttributes. +type ErrNoRangeThingWithCompositeAttributesByNameBranchCommitNotFound struct { + Name string + Branch string + Commit string +} + +var _ error = ErrNoRangeThingWithCompositeAttributesByNameBranchCommitNotFound{} + +// Error returns a description of the error. +func (e ErrNoRangeThingWithCompositeAttributesByNameBranchCommitNotFound) Error() string { + return "could not find NoRangeThingWithCompositeAttributes" +} + // ErrNoRangeThingWithCompositeAttributesAlreadyExists is returned when trying to overwrite a NoRangeThingWithCompositeAttributes. type ErrNoRangeThingWithCompositeAttributesAlreadyExists struct { NameBranch string diff --git a/samples/gen-go-db/server/db/mock_db.go b/samples/gen-go-db/server/db/mock_db.go index 29425822..aa089bfc 100644 --- a/samples/gen-go-db/server/db/mock_db.go +++ b/samples/gen-go-db/server/db/mock_db.go @@ -559,6 +559,21 @@ func (mr *MockInterfaceMockRecorder) GetNoRangeThingWithCompositeAttributes(ctx, return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetNoRangeThingWithCompositeAttributes", reflect.TypeOf((*MockInterface)(nil).GetNoRangeThingWithCompositeAttributes), ctx, name, branch) } +// GetNoRangeThingWithCompositeAttributesByNameBranchCommit mocks base method. +func (m *MockInterface) GetNoRangeThingWithCompositeAttributesByNameBranchCommit(ctx context.Context, name, branch, commit string) (*v9.NoRangeThingWithCompositeAttributes, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetNoRangeThingWithCompositeAttributesByNameBranchCommit", ctx, name, branch, commit) + ret0, _ := ret[0].(*v9.NoRangeThingWithCompositeAttributes) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetNoRangeThingWithCompositeAttributesByNameBranchCommit indicates an expected call of GetNoRangeThingWithCompositeAttributesByNameBranchCommit. +func (mr *MockInterfaceMockRecorder) GetNoRangeThingWithCompositeAttributesByNameBranchCommit(ctx, name, branch, commit interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetNoRangeThingWithCompositeAttributesByNameBranchCommit", reflect.TypeOf((*MockInterface)(nil).GetNoRangeThingWithCompositeAttributesByNameBranchCommit), ctx, name, branch, commit) +} + // GetNoRangeThingWithCompositeAttributessByNameVersionAndDate mocks base method. func (m *MockInterface) GetNoRangeThingWithCompositeAttributessByNameVersionAndDate(ctx context.Context, input GetNoRangeThingWithCompositeAttributessByNameVersionAndDateInput, fn func(*v9.NoRangeThingWithCompositeAttributes, bool) bool) error { m.ctrl.T.Helper() diff --git a/samples/gen-go-db/server/db/tests/tests.go b/samples/gen-go-db/server/db/tests/tests.go index 4d8117ee..b32361f3 100644 --- a/samples/gen-go-db/server/db/tests/tests.go +++ b/samples/gen-go-db/server/db/tests/tests.go @@ -56,6 +56,7 @@ func RunDBTests(t *testing.T, dbFactory func() db.Interface) { t.Run("DeleteNoRangeThingWithCompositeAttributes", DeleteNoRangeThingWithCompositeAttributes(dbFactory(), t)) t.Run("GetNoRangeThingWithCompositeAttributessByNameVersionAndDate", GetNoRangeThingWithCompositeAttributessByNameVersionAndDate(dbFactory(), t)) t.Run("ScanNoRangeThingWithCompositeAttributessByNameVersionAndDate", ScanNoRangeThingWithCompositeAttributessByNameVersionAndDate(dbFactory(), t)) + t.Run("GetNoRangeThingWithCompositeAttributesByNameBranchCommit", GetNoRangeThingWithCompositeAttributesByNameBranchCommit(dbFactory(), t)) t.Run("GetSimpleThing", GetSimpleThing(dbFactory(), t)) t.Run("ScanSimpleThings", ScanSimpleThings(dbFactory(), t)) t.Run("SaveSimpleThing", SaveSimpleThing(dbFactory(), t)) @@ -1980,6 +1981,7 @@ func GetNoRangeThingWithCompositeAttributes(s db.Interface, t *testing.T) func(t ctx := context.Background() m := models.NoRangeThingWithCompositeAttributes{ Branch: db.String("string1"), + Commit: db.String("string1"), Date: db.DateTime(mustTime("2018-03-11T15:04:01+07:00")), Name: db.String("string1"), Version: 1, @@ -2003,18 +2005,21 @@ func ScanNoRangeThingWithCompositeAttributess(d db.Interface, t *testing.T) func ctx := context.Background() require.Nil(t, d.SaveNoRangeThingWithCompositeAttributes(ctx, models.NoRangeThingWithCompositeAttributes{ Branch: db.String("string1"), + Commit: db.String("string1"), Date: db.DateTime(mustTime("2018-03-11T15:04:01+07:00")), Name: db.String("string1"), Version: 1, })) require.Nil(t, d.SaveNoRangeThingWithCompositeAttributes(ctx, models.NoRangeThingWithCompositeAttributes{ Branch: db.String("string2"), + Commit: db.String("string2"), Date: db.DateTime(mustTime("2018-03-11T15:04:02+07:00")), Name: db.String("string2"), Version: 2, })) require.Nil(t, d.SaveNoRangeThingWithCompositeAttributes(ctx, models.NoRangeThingWithCompositeAttributes{ Branch: db.String("string3"), + Commit: db.String("string3"), Date: db.DateTime(mustTime("2018-03-11T15:04:03+07:00")), Name: db.String("string3"), Version: 3, @@ -2024,18 +2029,21 @@ func ScanNoRangeThingWithCompositeAttributess(d db.Interface, t *testing.T) func expected := []models.NoRangeThingWithCompositeAttributes{ models.NoRangeThingWithCompositeAttributes{ Branch: db.String("string1"), + Commit: db.String("string1"), Date: db.DateTime(mustTime("2018-03-11T15:04:01+07:00")), Name: db.String("string1"), Version: 1, }, models.NoRangeThingWithCompositeAttributes{ Branch: db.String("string2"), + Commit: db.String("string2"), Date: db.DateTime(mustTime("2018-03-11T15:04:02+07:00")), Name: db.String("string2"), Version: 2, }, models.NoRangeThingWithCompositeAttributes{ Branch: db.String("string3"), + Commit: db.String("string3"), Date: db.DateTime(mustTime("2018-03-11T15:04:03+07:00")), Name: db.String("string3"), Version: 3, @@ -2118,6 +2126,7 @@ func SaveNoRangeThingWithCompositeAttributes(s db.Interface, t *testing.T) func( ctx := context.Background() m := models.NoRangeThingWithCompositeAttributes{ Branch: db.String("string1"), + Commit: db.String("string1"), Date: db.DateTime(mustTime("2018-03-11T15:04:01+07:00")), Name: db.String("string1"), Version: 1, @@ -2132,6 +2141,7 @@ func DeleteNoRangeThingWithCompositeAttributes(s db.Interface, t *testing.T) fun ctx := context.Background() m := models.NoRangeThingWithCompositeAttributes{ Branch: db.String("string1"), + Commit: db.String("string1"), Date: db.DateTime(mustTime("2018-03-11T15:04:01+07:00")), Name: db.String("string1"), Version: 1, @@ -2181,18 +2191,21 @@ func GetNoRangeThingWithCompositeAttributessByNameVersionAndDate(d db.Interface, Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:01+07:00")), Branch: db.String("string1"), + Commit: db.String("string1"), })) require.Nil(t, d.SaveNoRangeThingWithCompositeAttributes(ctx, models.NoRangeThingWithCompositeAttributes{ Name: db.String("string1"), Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:02+07:00")), Branch: db.String("string3"), + Commit: db.String("string3"), })) require.Nil(t, d.SaveNoRangeThingWithCompositeAttributes(ctx, models.NoRangeThingWithCompositeAttributes{ Name: db.String("string1"), Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:03+07:00")), Branch: db.String("string2"), + Commit: db.String("string2"), })) limit := int64(3) tests := []getNoRangeThingWithCompositeAttributessByNameVersionAndDateTest{ @@ -2214,18 +2227,21 @@ func GetNoRangeThingWithCompositeAttributessByNameVersionAndDate(d db.Interface, Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:01+07:00")), Branch: db.String("string1"), + Commit: db.String("string1"), }, models.NoRangeThingWithCompositeAttributes{ Name: db.String("string1"), Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:02+07:00")), Branch: db.String("string3"), + Commit: db.String("string3"), }, models.NoRangeThingWithCompositeAttributes{ Name: db.String("string1"), Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:03+07:00")), Branch: db.String("string2"), + Commit: db.String("string2"), }, }, err: nil, @@ -2249,18 +2265,21 @@ func GetNoRangeThingWithCompositeAttributessByNameVersionAndDate(d db.Interface, Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:03+07:00")), Branch: db.String("string2"), + Commit: db.String("string2"), }, models.NoRangeThingWithCompositeAttributes{ Name: db.String("string1"), Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:02+07:00")), Branch: db.String("string3"), + Commit: db.String("string3"), }, models.NoRangeThingWithCompositeAttributes{ Name: db.String("string1"), Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:01+07:00")), Branch: db.String("string1"), + Commit: db.String("string1"), }, }, err: nil, @@ -2279,6 +2298,7 @@ func GetNoRangeThingWithCompositeAttributessByNameVersionAndDate(d db.Interface, Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:01+07:00")), Branch: db.String("string1"), + Commit: db.String("string1"), }, }, }, @@ -2289,12 +2309,14 @@ func GetNoRangeThingWithCompositeAttributessByNameVersionAndDate(d db.Interface, Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:02+07:00")), Branch: db.String("string3"), + Commit: db.String("string3"), }, models.NoRangeThingWithCompositeAttributes{ Name: db.String("string1"), Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:03+07:00")), Branch: db.String("string2"), + Commit: db.String("string2"), }, }, err: nil, @@ -2313,6 +2335,7 @@ func GetNoRangeThingWithCompositeAttributessByNameVersionAndDate(d db.Interface, Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:03+07:00")), Branch: db.String("string2"), + Commit: db.String("string2"), }, Descending: true, }, @@ -2324,12 +2347,14 @@ func GetNoRangeThingWithCompositeAttributessByNameVersionAndDate(d db.Interface, Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:02+07:00")), Branch: db.String("string3"), + Commit: db.String("string3"), }, models.NoRangeThingWithCompositeAttributes{ Name: db.String("string1"), Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:01+07:00")), Branch: db.String("string1"), + Commit: db.String("string1"), }, }, err: nil, @@ -2353,12 +2378,14 @@ func GetNoRangeThingWithCompositeAttributessByNameVersionAndDate(d db.Interface, Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:02+07:00")), Branch: db.String("string3"), + Commit: db.String("string3"), }, models.NoRangeThingWithCompositeAttributes{ Name: db.String("string1"), Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:03+07:00")), Branch: db.String("string2"), + Commit: db.String("string2"), }, }, err: nil, @@ -2381,18 +2408,21 @@ func ScanNoRangeThingWithCompositeAttributessByNameVersionAndDate(d db.Interface Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:01+07:00")), Branch: db.String("string1"), + Commit: db.String("string1"), })) require.Nil(t, d.SaveNoRangeThingWithCompositeAttributes(ctx, models.NoRangeThingWithCompositeAttributes{ Name: db.String("string2"), Version: 2, Date: db.DateTime(mustTime("2018-03-11T15:04:02+07:00")), Branch: db.String("string2"), + Commit: db.String("string2"), })) require.Nil(t, d.SaveNoRangeThingWithCompositeAttributes(ctx, models.NoRangeThingWithCompositeAttributes{ Name: db.String("string3"), Version: 3, Date: db.DateTime(mustTime("2018-03-11T15:04:03+07:00")), Branch: db.String("string3"), + Commit: db.String("string3"), })) t.Run("basic", func(t *testing.T) { @@ -2402,18 +2432,21 @@ func ScanNoRangeThingWithCompositeAttributessByNameVersionAndDate(d db.Interface Version: 1, Date: db.DateTime(mustTime("2018-03-11T15:04:01+07:00")), Branch: db.String("string1"), + Commit: db.String("string1"), }, models.NoRangeThingWithCompositeAttributes{ Name: db.String("string2"), Version: 2, Date: db.DateTime(mustTime("2018-03-11T15:04:02+07:00")), Branch: db.String("string2"), + Commit: db.String("string2"), }, models.NoRangeThingWithCompositeAttributes{ Name: db.String("string3"), Version: 3, Date: db.DateTime(mustTime("2018-03-11T15:04:03+07:00")), Branch: db.String("string3"), + Commit: db.String("string3"), }, } // Consistent read must be disabled when scaning a GSI. @@ -2495,6 +2528,31 @@ func ScanNoRangeThingWithCompositeAttributessByNameVersionAndDate(d db.Interface } } +func GetNoRangeThingWithCompositeAttributesByNameBranchCommit(s db.Interface, t *testing.T) func(t *testing.T) { + return func(t *testing.T) { + ctx := context.Background() + m := models.NoRangeThingWithCompositeAttributes{ + Branch: db.String("string1"), + Commit: db.String("string1"), + Date: db.DateTime(mustTime("2018-03-11T15:04:01+07:00")), + Name: db.String("string1"), + Version: 1, + } + require.Nil(t, s.SaveNoRangeThingWithCompositeAttributes(ctx, m)) + m2, err := s.GetNoRangeThingWithCompositeAttributesByNameBranchCommit(ctx, *m.Name, *m.Branch, *m.Commit) + require.Nil(t, err) + require.Equal(t, m.Branch, m2.Branch) + require.Equal(t, m.Commit, m2.Commit) + require.Equal(t, m.Date.String(), m2.Date.String()) + require.Equal(t, m.Name, m2.Name) + require.Equal(t, m.Version, m2.Version) + + _, err = s.GetNoRangeThingWithCompositeAttributesByNameBranchCommit(ctx, "string2", "string2", "string2") + require.NotNil(t, err) + require.IsType(t, err, db.ErrNoRangeThingWithCompositeAttributesByNameBranchCommitNotFound{}) + } +} + func GetSimpleThing(s db.Interface, t *testing.T) func(t *testing.T) { return func(t *testing.T) { ctx := context.Background() diff --git a/samples/gen-go-deprecated/server/mock_controller.go b/samples/gen-go-deprecated/server/mock_controller.go index 040c5d4f..3afeecf5 100644 --- a/samples/gen-go-deprecated/server/mock_controller.go +++ b/samples/gen-go-deprecated/server/mock_controller.go @@ -8,7 +8,7 @@ import ( context "context" reflect "reflect" - v9 "github.com/Clever/wag/samples/gen-go-deprecated/models/v9" + models "github.com/Clever/wag/samples/gen-go-deprecated/models/v9" gomock "github.com/golang/mock/gomock" ) @@ -36,7 +36,7 @@ func (m *MockController) EXPECT() *MockControllerMockRecorder { } // Health mocks base method. -func (m *MockController) Health(ctx context.Context, i *v9.HealthInput) error { +func (m *MockController) Health(ctx context.Context, i *models.HealthInput) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Health", ctx, i) ret0, _ := ret[0].(error) diff --git a/samples/gen-go-errors/server/mock_controller.go b/samples/gen-go-errors/server/mock_controller.go index 1fb6bab7..5acc326f 100644 --- a/samples/gen-go-errors/server/mock_controller.go +++ b/samples/gen-go-errors/server/mock_controller.go @@ -8,7 +8,7 @@ import ( context "context" reflect "reflect" - v9 "github.com/Clever/wag/samples/gen-go-errors/models/v9" + models "github.com/Clever/wag/samples/gen-go-errors/models/v9" gomock "github.com/golang/mock/gomock" ) @@ -36,7 +36,7 @@ func (m *MockController) EXPECT() *MockControllerMockRecorder { } // GetBook mocks base method. -func (m *MockController) GetBook(ctx context.Context, i *v9.GetBookInput) error { +func (m *MockController) GetBook(ctx context.Context, i *models.GetBookInput) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBook", ctx, i) ret0, _ := ret[0].(error) diff --git a/samples/gen-go-nils/server/mock_controller.go b/samples/gen-go-nils/server/mock_controller.go index 78e89df8..61a7437e 100644 --- a/samples/gen-go-nils/server/mock_controller.go +++ b/samples/gen-go-nils/server/mock_controller.go @@ -8,7 +8,7 @@ import ( context "context" reflect "reflect" - v9 "github.com/Clever/wag/samples/gen-go-nils/models/v9" + models "github.com/Clever/wag/samples/gen-go-nils/models/v9" gomock "github.com/golang/mock/gomock" ) @@ -36,7 +36,7 @@ func (m *MockController) EXPECT() *MockControllerMockRecorder { } // NilCheck mocks base method. -func (m *MockController) NilCheck(ctx context.Context, i *v9.NilCheckInput) error { +func (m *MockController) NilCheck(ctx context.Context, i *models.NilCheckInput) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "NilCheck", ctx, i) ret0, _ := ret[0].(error) diff --git a/samples/gen-go-strings/server/mock_controller.go b/samples/gen-go-strings/server/mock_controller.go index 2ac3badc..a8535363 100644 --- a/samples/gen-go-strings/server/mock_controller.go +++ b/samples/gen-go-strings/server/mock_controller.go @@ -8,7 +8,7 @@ import ( context "context" reflect "reflect" - v9 "github.com/Clever/wag/samples/gen-go-strings/models/v9" + models "github.com/Clever/wag/samples/gen-go-strings/models/v9" gomock "github.com/golang/mock/gomock" ) @@ -36,7 +36,7 @@ func (m *MockController) EXPECT() *MockControllerMockRecorder { } // GetDistricts mocks base method. -func (m *MockController) GetDistricts(ctx context.Context, i *v9.GetDistrictsInput) error { +func (m *MockController) GetDistricts(ctx context.Context, i *models.GetDistrictsInput) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetDistricts", ctx, i) ret0, _ := ret[0].(error) diff --git a/samples/gen-js-db-custom-path/index.d.ts b/samples/gen-js-db-custom-path/index.d.ts index 8af53088..31575a87 100644 --- a/samples/gen-js-db-custom-path/index.d.ts +++ b/samples/gen-js-db-custom-path/index.d.ts @@ -112,6 +112,7 @@ declare namespace SwaggerTest { type NoRangeThingWithCompositeAttributes = { branch: string; + commit: string; date: string; name: string; version?: number; diff --git a/samples/gen-js-db/index.d.ts b/samples/gen-js-db/index.d.ts index 8af53088..31575a87 100644 --- a/samples/gen-js-db/index.d.ts +++ b/samples/gen-js-db/index.d.ts @@ -112,6 +112,7 @@ declare namespace SwaggerTest { type NoRangeThingWithCompositeAttributes = { branch: string; + commit: string; date: string; name: string; version?: number; diff --git a/server/gendb/bindata.go b/server/gendb/bindata.go index dec240e4..6ffd8acc 100644 --- a/server/gendb/bindata.go +++ b/server/gendb/bindata.go @@ -3,9 +3,9 @@ // dynamodb-local.sh.tmpl (592B) // dynamodb.go.tmpl (10.408kB) // dynamodb_test.go.tmpl (3.828kB) -// interface.go.tmpl (14.016kB) -// table.go.tmpl (55.673kB) -// tests.go.tmpl (64.425kB) +// interface.go.tmpl (14.122kB) +// table.go.tmpl (55.998kB) +// tests.go.tmpl (64.566kB) package gendb @@ -133,7 +133,7 @@ func dynamodb_testGoTmpl() (*asset, error) { return a, nil } -var _interfaceGoTmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5b\x6d\x6f\xdc\x36\xf2\x7f\x6d\x7d\x8a\xc1\x36\xf8\xc3\x0e\xbc\xda\xf4\x8f\xc3\xbd\x30\xe0\x17\x1b\xdb\x49\x7c\x69\x92\x5e\xec\xb6\x07\x04\x81\xc1\x95\x46\xbb\x84\x25\x52\x21\x29\xdb\xdb\xc5\x7e\xf7\x03\x1f\xf4\x4c\xed\x83\xed\x06\x3d\x20\x05\x9a\xac\x24\xce\x03\x67\x86\x33\x3f\x0e\x99\x9c\x44\xb7\x64\x8e\x10\xcf\x82\x80\x66\x39\x17\x0a\x0e\x83\x83\x51\xc4\x99\xc2\x07\x35\x0a\x02\x80\xd1\x6a\x05\xe1\x07\x1e\x17\x29\x7e\x24\x19\xc2\x7a\xbd\x5a\x85\x6f\xf9\xa7\x42\xe5\x85\xfa\x95\xa8\xc5\x7a\x3d\xc9\x78\x8c\xa9\x5c\xad\xc2\xdf\x51\x48\xca\xd9\x55\x91\x24\xf4\x61\xbd\x1e\x05\x07\xab\xd5\x18\x68\x02\x84\x2d\xaf\xc9\x2c\xc5\x77\x44\x5e\x0b\xc2\x24\x89\x14\xe5\x4c\x5e\x30\xfd\x32\x86\xf0\x3f\xe7\xaf\xcf\x38\x4b\xe8\x5c\xc2\x7a\xad\xa5\xce\xa9\x5a\x14\xb3\x30\xe2\xd9\x84\xdc\x4b\xfd\xff\x58\xc6\xb7\xe3\x39\x9f\x48\x14\x77\x34\xc2\x49\xbc\x64\x24\xe3\xf1\x6c\x82\x0f\xb9\x40\xa9\xe5\x8e\x02\x00\x2d\x10\x59\x6c\xd9\x74\xa4\xff\x26\x51\x9e\x13\x85\xd7\x34\xc3\xae\xcc\x83\xa6\xc8\x39\x1f\xf3\x1c\x19\xc9\xe9\x44\x2a\x91\x64\x4a\x73\xb6\xff\x95\xfc\xc7\x9a\xa6\xc3\x7f\x9a\xa6\xfc\x5e\x5e\x45\x84\x49\x0f\x7b\x9e\x12\x36\x0f\xb9\x98\x4f\x1e\x26\x8a\x66\x38\x11\x44\xa1\x9f\xf1\x51\x10\x4c\x26\x73\x7e\x32\x47\x86\x7a\x14\x64\x3c\xba\x9d\x23\x83\xb1\xe4\x85\x88\xf0\xf4\xc5\xdb\x4f\x6f\x2e\x7f\xb9\x80\x71\x8c\x52\x51\x46\xb4\x35\x4f\xf5\xa0\x9b\x78\x16\xce\x39\x8c\x6b\xcf\xc2\x78\x3c\x2b\x68\x1a\xdf\x24\x29\x99\xcb\xd3\xf1\x38\xe3\xf1\x69\xc6\x63\x18\x5b\x8f\xcb\x53\xeb\xbe\xd3\xd5\xaa\xe1\xe7\x7d\xdc\xac\x95\x85\x4b\xa6\x50\x24\x24\x42\x48\xb8\x00\xaa\x9f\xb4\x93\xd9\x1c\xee\xa9\x5a\x80\x5a\x20\xac\x56\xe1\x95\x75\x9e\x95\x00\x31\x51\x64\x46\x24\x86\x81\x5a\xe6\xd8\x60\x41\xab\x5f\xab\xa0\xb4\x8d\x20\x6c\x8e\xf0\xe2\x21\x9e\x59\xb3\xc2\xc9\x69\x3f\x6e\xec\xd0\x17\x46\x53\x13\xae\x27\xa7\x90\x13\x19\x91\x94\xfe\xd9\x24\x0e\xaf\xa2\x05\x66\xc4\x45\x74\x4d\x98\xdf\x7e\xd0\xa4\x53\xa5\x04\x9d\x15\xca\x28\x2a\x35\x93\xac\xff\xfa\x0d\x17\x97\x2c\xc6\x87\xa6\x4e\x0d\x09\xe7\x26\x3e\xcf\x5f\x87\xef\x71\x69\xa5\x95\x92\x26\x13\xb8\x22\x77\xb8\x5a\x35\x15\x5d\xaf\x41\x92\x3b\x94\x40\xa0\xf7\x41\x71\x63\xbf\xda\x5c\x9a\x8b\x8f\xc5\x61\xa4\x1e\xc0\xad\xde\xf0\xcc\xfe\x7d\x0c\x99\xd5\x5e\x86\xdd\xe1\x47\x80\x42\x70\x51\x4d\x9f\x26\xcd\x09\x98\x68\x7e\x4d\x54\xb4\xf8\x43\x50\x85\xb2\xa3\xfe\x54\x08\xb2\xfc\x94\xf4\x94\x9d\x69\x8a\x72\x2e\x69\x0a\x54\x61\x26\x81\x32\xf8\xf2\x75\xf7\x89\x0d\x30\x1f\x98\x9f\x84\x2f\x5f\x77\x98\xe2\x64\x02\xe7\x98\xa2\xda\xa2\x7a\x6c\xc6\x6c\x57\x9e\x32\x8f\xf2\x1b\x05\x3c\x4d\xfd\x56\x66\x33\xb3\x79\x8b\xaa\xa7\x95\x40\x25\x28\x0e\x04\x52\x22\x78\xe6\x51\xda\xc3\xc7\xab\xaa\x4d\x78\x6e\x21\xde\x1c\xc3\x0b\xd2\x5c\x10\x7a\x99\x0c\x2c\xa0\x32\x57\xde\x11\xc1\xf4\xc8\x0e\xe1\x7a\xad\x55\x9d\xf3\xeb\x65\x8e\x6f\xb8\xa8\x88\x5b\x2b\xab\x4b\xe2\xb4\x29\x53\xa6\x9e\xc7\x11\x1c\xbe\x1c\x30\xe4\xb1\x35\xe4\xd1\xa6\x58\xff\x55\xd0\x8c\x88\xa5\x59\xd4\x3a\x89\x37\x03\x3e\x22\xac\xcb\x52\x82\x28\x98\x36\xb3\xd4\x63\x39\x73\x39\xae\x3b\x48\xe9\xca\xe0\x22\xdb\xc7\xc5\x1f\x14\x94\xe5\x85\xf2\x13\x5c\xea\x4f\xc7\x90\x30\x48\x0a\x16\x1d\x66\x30\x3c\xe7\x94\xc8\x7e\x84\xcc\x38\x4f\x8f\xdc\x9f\x83\xd1\xe5\x4c\x44\xb5\x2d\xde\x11\xf9\x59\xfb\xfc\x3d\x2e\x77\x4b\x70\x26\x95\x1a\xd2\x32\x2e\xea\x87\x5d\x33\xa4\x27\x26\xe5\xeb\xa5\x7e\x55\xf3\xea\x84\x7b\xae\x0b\x1e\x4f\x3c\x3e\xd8\x3d\xee\x3d\x32\x36\x39\x68\x37\x0e\xdf\xc5\x63\x55\x76\xeb\x91\x57\x09\x6d\xe7\x84\xe0\x67\xf4\x3f\x9a\x13\xda\x16\x73\x9a\xce\x25\x35\xba\x79\xa2\xf1\x6d\xca\x67\x24\xbd\xc2\x88\xb3\xb8\x4c\x07\x28\x77\x8a\xed\xb9\xa4\xfe\xd5\xe0\x5d\x4a\xde\xd1\x3f\x42\x7f\xd7\xd0\x4f\x25\x6e\x36\xda\x16\x9b\x3d\xa1\x3a\xee\x68\xa9\xa0\x46\xf6\x8d\x05\x72\x6b\x00\xa5\xdf\xfb\x76\x70\xb5\x24\x6e\x65\x38\xdd\x7f\x55\x78\xa8\x9a\xaa\x3c\xb6\x62\x0e\x54\x87\xe6\xa6\xa7\xa9\x85\x9e\xdf\x65\xc3\x42\x1b\x4b\xa9\xcf\x55\xfe\xe2\xda\x1a\x63\x1e\x36\xd4\xd6\xfd\x22\x7a\x47\x16\xdf\xad\xfe\x76\x1e\x5d\x08\x29\xb7\x7f\xfe\x83\xaa\x45\x63\x17\xd3\x4e\x66\x76\x63\xdd\xdc\x6a\xb7\xf2\x57\x93\xc7\x87\x81\xbd\xd2\x80\x9c\xda\x91\x25\x77\xdf\x46\x64\xca\x62\xfd\xca\x2f\xa7\xda\xea\xf4\x4c\x43\x58\x0c\x1b\xe9\x88\x04\xc2\x80\x28\x9e\xd1\x08\x54\x3d\xbd\xb0\x54\xea\x37\x89\x26\x54\x78\xae\x5f\x93\x54\xfb\x3a\xa6\xfa\x37\xe4\x44\x90\x0c\x15\x0a\xa9\xf7\x1d\x02\xbf\x15\x54\x20\xe4\x02\xc7\x0d\x46\xf5\x78\x69\x36\xb2\x48\xa2\x05\xe4\x85\x32\xfc\x9f\x30\xe3\x01\xe8\xff\xf3\xd0\xd6\x4c\x7f\x3b\xab\x55\x79\x59\x37\x39\xc2\xea\xf5\x6b\xbd\xad\x47\x71\x0c\xd9\xff\x37\xd9\x0c\xa9\xa0\xc7\xed\xc8\x72\x20\x30\xdd\x73\xf9\x58\x6d\xfc\xff\xf9\x0f\x9d\x58\x0b\x61\x16\x6c\xce\xcd\xee\xbd\xdc\xdb\x51\xf3\xf9\x8e\xa4\x05\xea\xe8\x92\x18\x03\x65\x61\xa0\x97\x8e\x25\x3d\xa4\x76\xcc\x11\xbc\xb4\x63\x57\x8e\x19\xfc\x1f\x05\x2b\xe2\x4a\x09\xca\xe6\xc3\x32\xa4\xfd\xee\x17\x62\x89\x0f\xa5\x1b\x75\x04\x2f\xdd\xf0\x5a\x8e\xd4\x72\xf6\xe8\x15\x69\xa8\x55\x7e\xda\xa4\x54\x92\xa9\xb0\x1a\xe8\xd7\xae\xfc\x7c\x18\x77\x09\xac\xa2\x2d\x16\xb5\xc6\x31\xac\x83\xa6\x63\x06\x94\x1f\x50\x7c\x27\xa5\x37\x28\xdc\x56\xb6\xad\xe8\x16\x25\x77\xe8\xe2\x3c\xaa\x83\xb3\xc7\x96\x6e\xa8\x06\x99\xbc\x0e\x54\xba\xb0\xd5\x0f\xce\x2a\xfe\xdd\x5f\x86\x6a\xc1\x63\xd7\xbb\xda\xc0\x51\x2a\x51\x44\x0a\x56\xc1\x81\x09\x65\x22\x14\x65\xf3\x69\xa2\xad\x4e\x4d\x3a\xab\x72\x95\xcc\x31\xa2\x09\x8d\x4c\x3b\x4f\xc3\x39\xc2\xe0\x10\x1f\xa2\xb4\x90\xf4\x0e\x8f\x40\x3a\x62\xeb\xb5\x30\x38\x68\x73\x1b\xaa\x43\x46\xf0\x39\x95\x3a\x32\xce\x38\x93\x54\x2a\x64\xea\x33\x92\x18\x6c\x18\xf0\x24\xb1\xb8\x07\x13\x52\xa4\x0a\x66\xb8\x20\x77\x94\x0b\xad\x82\x28\x18\xd3\x22\x89\xce\x5e\x8e\x14\x04\x92\x38\x0c\x0e\xfc\x3c\x75\x65\x33\x22\x7f\xa1\x19\x55\xdd\x39\xa6\xe6\x25\x4f\x60\xc1\xef\x21\x23\x6c\xe9\x7a\x2c\x8a\x03\xea\x88\x23\x0a\xc3\xe0\xc0\x92\xda\x84\x50\xf3\xea\x5b\xcc\x71\x63\x86\xdb\xb7\x82\x46\xb7\x69\xc9\x90\x08\x34\xe0\x81\x61\x5c\x32\xd4\x36\x12\x5a\x80\x7b\x0a\x5a\xf1\xf9\xa4\x5d\xab\x21\x5e\x10\xb9\xd0\xc8\xbe\x24\xdd\x42\xf6\xaa\x22\xfc\xcb\xdb\x8e\x46\x0a\xe3\xcc\x50\xf6\xc5\x94\x5f\x7c\x5a\x34\xc5\x78\xf5\x2c\xd9\xa7\xc8\x3e\x76\x25\x18\xee\x29\xb2\x41\xe1\xf5\xd2\xdd\xbf\xd5\x60\xa4\x8a\x72\xf8\x8e\x46\xff\xb9\x47\xd9\x56\xd6\x6f\xf1\xf7\xb8\xd4\x90\x7b\x77\x9b\x8f\x3e\x4f\x3f\xbe\xbd\x18\x41\xc3\x38\x9f\xbd\xf2\x8c\x71\x3c\xaa\xd4\x86\x99\xab\x21\xdb\xbe\x6a\xa0\xb1\xed\x5b\x94\x37\x34\x55\x28\xcc\x39\x45\xb5\x6d\x10\xa8\x31\x00\x32\x65\xb3\x5e\x42\x31\x8d\x25\xdc\x23\xe8\x5c\x49\xf2\x3c\x5d\x42\x62\xc8\xcc\x02\xd5\x80\xe8\x5b\x81\x82\xa2\xb4\x90\x9c\x4a\x6b\x73\xa3\x84\xc9\x83\x8f\x53\xc3\x56\xe4\x2e\xd2\xed\x77\x12\x86\x83\xc8\x6e\x6f\x74\x8a\x52\x3d\x1d\x56\xab\x66\x05\xf1\xb5\x19\x1e\xa1\xf2\xa9\x39\x19\xeb\x71\x1b\x79\x31\xd3\x1e\xfe\xf9\x5d\x57\x5d\xd9\x74\x0c\x71\x2e\xd0\x26\xd7\x3b\x7d\xa1\x68\x54\xa4\x44\x58\x6f\x69\xbf\xcc\x74\xbd\x8a\xd2\x22\x36\x85\xda\x78\x52\xbb\x69\xb9\xbf\x5b\x9c\xf4\xaa\x64\x59\xb3\x4e\x26\xd0\xde\x50\xba\x22\x49\x94\xb2\xc6\xb8\x47\x93\x6e\x89\x52\x98\xe5\xa6\x42\x29\xee\xc2\xc7\x86\x55\x6a\x31\x86\xe3\xd7\x66\xf6\x28\xfb\x7b\x34\x73\xba\x77\x2a\x44\x85\xfa\x9d\xa1\x0a\x8d\x66\xee\x17\xc8\xb4\xd2\xf7\x84\x99\x22\x1f\xf1\x2c\xd7\x13\x68\x4d\x4a\x4f\x01\x24\x65\xf3\xb4\xc4\x42\x5c\x40\x56\xa4\x8a\xe6\xe5\x1b\xd9\x9d\x90\xd3\xe1\xcb\xd7\xea\x04\x6b\x65\x63\xb3\x59\x69\x00\x82\x9d\xbb\x3c\x2d\x50\x62\x9c\x5a\x43\x93\xdd\x38\x38\x80\xb2\x8f\xb8\x86\xfb\x37\x2d\xc7\xe7\x4a\x95\xef\xa6\x57\xef\x46\xed\x54\xb6\x69\xbd\x52\x59\x6e\xde\xe2\xe0\x00\xb6\x8d\xde\xbf\x89\x38\x70\x88\xec\xd2\xb0\x27\x8b\x9b\x92\x72\x00\x35\xb6\x53\xf0\xb2\xa9\xd5\x94\xc5\xff\xe2\x74\x30\xcd\xf7\xdb\x59\xa6\x62\xf4\xcc\xed\xaa\x9b\x87\xc9\x2b\x3f\xe1\x5b\x33\x6f\x4d\xba\xbf\x05\xaa\x69\xe3\xb7\x3e\xc7\xd1\x97\xaf\xb3\xa5\xc2\x51\x3d\x74\x93\x0b\x1a\x66\x69\x65\x4c\xc7\xac\xd9\xf0\x68\xd9\x60\x47\x9e\x2f\xb7\x31\x6d\xfa\xb1\x7a\xf0\x42\xf1\x2a\xae\xbc\x48\xbc\x02\xe2\x8f\xc6\xe1\x00\xe7\x28\x23\x64\xb1\xa6\x35\x30\xd9\xb6\xed\x9f\x1f\x9a\xc3\x00\xd3\x5a\xe8\x93\xc1\x79\x89\xce\xbb\x0b\x64\x0b\x4e\x69\xd5\x99\x8e\x78\x22\x04\x59\x6a\xf1\x0d\xcc\x61\xab\x08\x67\x70\x47\x04\xe5\x85\x3b\x4f\x83\xca\xe1\x36\x05\xb7\xb8\xf6\xcf\x6a\x37\x97\xbb\xb6\x6a\x17\x55\x5b\xa4\x4c\xbb\xae\x7c\xd5\xfd\x12\x57\x4a\xb4\x6a\x14\x4d\x05\xe6\x85\x2e\xc7\x2a\x45\x1d\x3c\xb5\x6e\x50\xb2\x36\x05\x47\x60\x82\x02\x59\x64\x7c\xc6\xea\x61\xba\x26\xc1\x4f\xd3\xeb\xeb\xcf\x97\xaf\x7f\xbb\xbe\xb8\xf9\x38\xfd\x70\x51\x12\xe2\xc3\x89\xb6\xad\x2b\x4c\x6e\x3c\x95\x10\x91\x34\xc5\x18\x46\x91\x40\xa2\x30\xbe\x21\x6a\xa4\x4b\x3f\x55\x12\xee\xc9\x5c\x87\x0b\x65\xb6\xed\x65\x98\x9f\x7d\xbe\x98\x5e\x5f\x9c\xdf\x4c\xaf\x07\x35\xe2\xcc\x9c\x20\x68\x49\x73\x7a\x87\xcc\x55\x38\x43\x7f\xb2\xaa\x84\xdf\x30\x92\xe1\xfa\xc6\x7c\x7c\x75\x3c\xf4\xe5\xe7\x63\x40\x15\x85\xcf\x3b\x8b\x93\x7a\x58\x25\xbf\xfb\xaa\x23\x58\x22\xc2\x42\xa9\x5c\x9e\x4c\x26\x31\x8f\x64\x48\xee\x65\x48\x32\xf2\x27\x67\xf6\x6e\x91\xf9\x59\x5d\x25\x4a\x89\x42\xa9\x26\x31\xde\x61\xca\x73\x14\xf3\x82\xc6\x38\xf9\xb7\x2e\xbb\xe1\x42\x65\xe9\x4f\xf6\xe7\x7b\x5c\x56\x1d\xb3\x3a\x5c\xaa\x38\xd2\x30\x59\x53\x12\x16\xa1\x8e\x5c\x73\xfd\x46\x9b\x18\x3b\x63\x7b\x01\x57\x03\xe1\x16\x5a\x68\xb7\x51\x26\x13\xb8\x10\xa2\x15\xe2\xeb\xf5\x47\xae\xde\xf0\x82\xc5\xb6\x3a\xea\xdc\x51\xc2\x9c\xe6\x81\x06\x24\x84\xa6\x16\xca\x53\x16\x77\xcf\x40\x2a\xac\xb0\x81\x7d\x07\x19\x6e\xc1\xeb\x9b\x4e\xfe\x9e\xbf\x6a\xb7\x8f\x38\x6c\x83\xf2\x8e\x08\xb8\xb1\xdd\x4c\x38\xdd\x30\xb1\x55\x65\x58\x2e\x1a\xed\xb1\x18\x65\x24\x68\x5e\x56\x01\x6d\x4b\xc3\xcb\x35\xc3\x0e\x37\xd9\xea\xc8\x72\x3b\x3c\x2a\xfb\x93\xab\xe0\xc0\xb5\xc6\x46\x11\x2f\xd2\x18\x18\x57\xd6\x11\x1d\x0e\xa3\xc0\x74\xcb\x9e\x74\x56\x69\xa0\x80\xc6\xb5\x85\xc2\xf8\x72\xd7\xf3\xca\x81\x36\x46\x7b\xdc\xab\x8d\xbb\x76\x3f\x4f\xcf\x36\xbd\x3d\xf0\xf9\xf6\xe5\x6d\xbe\xcf\xb1\x11\xdf\x88\xd6\xfb\x36\x7e\x2c\x6a\xf7\x71\xda\x8a\xde\x87\xc5\x3f\x3b\x8a\xef\x18\xf6\x07\x6c\xff\x01\xdb\xbf\x2f\x6c\x7f\x22\xce\x7e\x36\xc8\xdb\x3f\xd6\xd0\x6b\xe3\x89\x2d\xdc\x5e\xde\xf4\xd6\xf9\xe1\x45\xff\x17\x23\x80\x1d\x04\xef\x87\x0d\x06\x2c\xf6\x77\x02\x07\xdb\xe7\xfc\x8c\xb0\x61\xbb\xb0\x27\x03\x8a\x47\x5c\xda\xd8\x7c\x61\x63\x6b\xed\xdb\x7e\x8c\x36\xcc\x68\x87\x03\xb6\x9d\x4b\xe0\x8f\xa3\xb7\xbf\xf5\xd1\x5b\x50\x5f\x2a\x28\xc3\x54\x87\x72\xf7\x34\xf7\xd3\x1d\x8a\xfb\xea\x2e\xba\x27\x3f\xc2\x7a\x3d\x4d\xb5\x85\x96\x17\x0f\x54\x2a\xe9\xc9\x85\x62\xe9\xda\xd3\xbc\x64\xe6\xb9\x0a\x36\x90\x05\x7b\xec\xeb\xf8\xea\xdc\xf1\xca\x6f\x87\x10\x7b\x2b\xc5\x77\x32\x5d\x7e\xfb\x98\xeb\x5e\x1e\xaa\xfa\x1a\xe4\x2e\x89\xae\x3b\xad\x67\x4b\x6a\x5d\xc6\x9b\x12\x58\xff\x2e\x90\xa5\x04\x34\xa4\x23\x4f\xd1\x75\xf6\xd6\xcb\x9f\x4b\xaa\x1a\x87\x33\x6d\xdb\x9f\xf5\x06\x48\x87\x2c\xec\x95\x09\x93\x37\x4a\x80\x78\xc6\x99\x22\x94\xc9\x2b\x9b\x10\x30\xee\x53\xb7\xac\xdf\x97\xde\xf6\x46\xd9\x6d\xf4\x22\x4b\x0f\xf1\xaf\x82\xe7\x28\x14\x35\x31\xee\x02\x2c\x0c\xea\x63\x9c\x47\x33\xe9\xff\x53\x9a\x7e\x4d\xde\xc6\xaa\xba\x45\xf8\x57\xd4\xe7\x16\xea\xeb\x20\xbf\xae\xeb\xdd\xef\xff\x06\x00\x00\xff\xff\x18\xe1\xdc\x39\xc0\x36\x00\x00") +var _interfaceGoTmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5b\x6f\x6f\xdb\x38\xd2\x7f\x1d\x7d\x8a\x81\xb7\x78\x90\x14\xb1\xdc\x7d\x70\xb8\x17\x01\xf2\xc2\x4d\xd2\x36\xd7\x6d\xbb\xd7\x64\x77\x0f\x28\x8a\x80\x96\x46\x32\x11\x89\x54\x49\x2a\x89\xd7\xf0\x77\x3f\x90\xd4\x7f\x51\xb6\x9c\xa4\x8b\x3d\xa0\x0b\x6c\x6b\x49\x9c\xdf\x0c\x67\x86\x33\xc3\x21\x9b\x91\xe0\x96\xc4\x08\xe1\xc2\xf3\x68\x9a\x71\xa1\xe0\xd0\x3b\x98\x04\x9c\x29\x7c\x50\x13\xcf\x03\x98\xac\xd7\xe0\x7f\xe0\x61\x9e\xe0\x47\x92\x22\x6c\x36\xeb\xb5\xff\x96\x7f\xca\x55\x96\xab\x5f\x89\x5a\x6e\x36\xb3\x94\x87\x98\xc8\xf5\xda\xff\x1d\x85\xa4\x9c\x5d\xe5\x51\x44\x1f\x36\x9b\x89\x77\xb0\x5e\x4f\x81\x46\x40\xd8\xea\x9a\x2c\x12\x7c\x47\xe4\xb5\x20\x4c\x92\x40\x51\xce\xe4\x05\xd3\x2f\x43\xf0\xff\x73\xfe\xfa\x8c\xb3\x88\xc6\x12\x36\x1b\xcd\x35\xa6\x6a\x99\x2f\xfc\x80\xa7\x33\x72\x2f\xf5\xff\x53\x19\xde\x4e\x63\x3e\x93\x28\xee\x68\x80\xb3\x70\xc5\x48\xca\xc3\xc5\x0c\x1f\x32\x81\x52\xf3\x9d\x78\x00\x9a\x21\xb2\xd0\xc2\x74\xb8\xff\x26\x51\x9e\x13\x85\xd7\x34\xc5\x2e\xcf\x83\x26\xcb\x98\x4f\x79\x86\x8c\x64\x74\x26\x95\x88\x52\xa5\x91\xed\x7f\x25\xfe\x54\xd3\x74\xf0\xe7\x49\xc2\xef\xe5\x55\x40\x98\x74\xc0\xf3\x84\xb0\xd8\xe7\x22\x9e\x3d\xcc\x14\x4d\x71\x26\x88\x42\x37\xf0\x91\xe7\xcd\x66\x31\x3f\x89\x91\xa1\x1e\x05\x29\x0f\x6e\x63\x64\x30\x95\x3c\x17\x01\x9e\xbe\x78\xfb\xe9\xcd\xe5\x2f\x17\x30\x0d\x51\x2a\xca\x88\xd6\xe6\xa9\x1e\x74\x13\x2e\xfc\x98\xc3\xb4\xb6\x2c\x4c\xa7\x8b\x9c\x26\xe1\x4d\x94\x90\x58\x9e\x4e\xa7\x29\x0f\x4f\x53\x1e\xc2\xd4\x5a\x5c\x9e\x5a\xf3\x9d\xae\xd7\x0d\x3b\xef\x63\x66\x2d\x2c\x5c\x32\x85\x22\x22\x01\x42\xc4\x05\x50\xfd\xa4\x8d\xcc\x62\xb8\xa7\x6a\x09\x6a\x89\xb0\x5e\xfb\x57\xd6\x78\x96\x03\x84\x44\x91\x05\x91\xe8\x7b\x6a\x95\x61\x03\x82\x56\xbf\xd6\x5e\xa9\x1b\x41\x58\x8c\xf0\xe2\x21\x5c\x58\xb5\xc2\xc9\x69\xdf\x6f\xec\xd0\x17\x46\x52\xe3\xae\x27\xa7\x90\x11\x19\x90\x84\xfe\xd9\x24\xf6\xaf\x82\x25\xa6\xa4\xf0\xe8\x9a\x30\xbb\xfd\xa0\x49\xe7\x4a\x09\xba\xc8\x95\x11\x54\x6a\x90\xb4\xff\xfa\x0d\x17\x97\x2c\xc4\x87\xa6\x4c\x0d\x0e\xe7\xc6\x3f\xcf\x5f\xfb\xef\x71\x65\xb9\x95\x9c\x66\x33\xb8\x22\x77\xb8\x5e\x37\x05\xdd\x6c\x40\x92\x3b\x94\x40\xa0\xf7\x41\x71\xa3\xbf\x5a\x5d\x1a\xc5\x05\x71\x18\xa8\x07\x28\x56\xaf\x7f\x66\xff\x3e\x86\xd4\x4a\x2f\xfd\xee\xf0\x23\x40\x21\xb8\xa8\xa6\x4f\xa3\xe6\x04\x8c\x37\xbf\x26\x2a\x58\xfe\x21\xa8\x42\xd9\x11\x7f\x2e\x04\x59\x7d\x8a\x7a\xc2\x2e\x34\x45\x39\x97\x24\x01\xaa\x30\x95\x40\x19\x7c\xf9\x3a\x7e\x62\x03\xe0\x03\xf3\x93\xf0\xe5\xeb\x88\x29\xce\x66\x70\x8e\x09\xaa\x1d\xa2\x87\x66\xcc\x6e\xe1\x29\x73\x08\xbf\x95\xc1\xd3\xc4\x6f\x45\x36\x33\x9b\xb7\xa8\x7a\x52\x09\x54\x82\xe2\x80\x23\x45\x82\xa7\x0e\xa1\x1d\x38\x4e\x51\x6d\xc0\x2b\x16\xe2\xcd\x31\xbc\x20\xcd\x05\xa1\x97\xc9\xc0\x02\x2a\x63\xe5\x1d\x11\x4c\x8f\xec\x10\x6e\x36\x5a\xd4\x98\x5f\xaf\x32\x7c\xc3\x45\x45\xdc\x5a\x59\x5d\x92\x42\x9a\x32\x64\xea\x79\x1c\xc1\xe1\xcb\x01\x45\x1e\x5b\x45\x1e\x6d\xf3\xf5\x5f\x05\x4d\x89\x58\x99\x45\xad\x83\x78\xd3\xe1\x03\xc2\xba\x90\x12\x44\xce\xb4\x9a\xa5\x1e\xcb\x59\x11\xe3\xba\x83\x94\xce\x0c\x85\x67\xbb\x50\xdc\x4e\x41\x59\x96\x2b\x37\xc1\xa5\xfe\x74\x0c\x11\x83\x28\x67\xc1\x61\x0a\xc3\x73\x4e\x88\xec\x7b\xc8\x82\xf3\xe4\xa8\xf8\x73\xd0\xbb\x0a\x15\x51\xad\x8b\x77\x44\x7e\xd6\x36\x7f\x8f\xab\x71\x01\xce\x84\x52\x43\x5a\xfa\x45\xfd\x30\x36\x42\x3a\x7c\x52\xbe\x5e\xe9\x57\x35\x56\xc7\xdd\x33\x9d\xf0\x78\xe4\xb0\xc1\x78\xbf\x77\xf0\xd8\x66\xa0\x71\x08\x7f\x89\xc5\xaa\xe8\xd6\x23\xaf\x02\xda\xe8\x80\xe0\x06\xfa\x1f\x8d\x09\x6d\x8d\x15\x92\xc6\x92\x1a\xd9\x1c\xde\xf8\x36\xe1\x0b\x92\x5c\x61\xc0\x59\x58\x86\x03\x94\xa3\x7c\x3b\x96\xd4\xbd\x1a\x9c\x4b\xc9\x39\xfa\x87\xeb\x8f\x75\xfd\x44\xb6\x6b\xb7\x58\xd2\x27\x16\x6f\x7b\x18\x64\x87\x3d\x9e\x90\x79\x47\x5a\xc1\xab\x77\x0d\x5b\x17\xdf\x80\x56\x8a\xc9\x59\x80\xe7\x5d\x82\xfd\xed\xcc\xbe\xb9\x79\x20\x0f\x35\xb7\x57\x5d\xb3\x5d\x36\xf4\xb5\x35\x69\xbb\x0c\xe7\x4e\xe3\xad\x31\xe6\x61\x4b\x16\xdf\x6f\xed\x8c\x84\xf8\xcb\x32\x7d\xe7\xb1\x70\x28\x55\xec\xd4\xff\xa0\x6a\xd9\xd8\x2f\xb5\xc3\xa6\xdd\xc2\x37\x37\xf5\xad\x45\xd9\xc4\xf8\x30\xb0\x2b\x1b\xe0\x53\x1b\xb2\x44\x77\x6d\x79\xe6\x2c\xd4\xaf\xdc\x7c\xaa\x4d\x55\x4f\x35\x84\x85\xb0\x95\x8e\x48\x20\x0c\x88\xe2\x29\x0d\x40\xd5\xd3\xf3\x4b\xa1\x7e\x93\x68\x5c\x85\x67\xfa\x35\x49\xb4\xad\x43\xaa\x7f\x43\x46\x04\x49\x51\xa1\x90\x7a\x87\x23\xf0\x5b\x4e\x05\x42\x26\x70\xda\x00\xaa\xc7\x4b\xb3\x65\x46\x12\x2c\x21\xcb\x95\xc1\x7f\xc2\x8c\x07\x36\x19\x3f\x0f\x6d\x02\xf5\xb7\xb3\x5a\x94\x97\x75\x3b\xc5\xaf\x5e\xbf\xce\x69\x12\xa2\x38\x86\xf4\xff\x9b\x30\x43\x22\xe8\x71\x23\x21\x07\x1c\xb3\x78\x2e\x1f\xab\x16\xc3\x3f\xff\xa1\xc3\x6c\x2e\xcc\x82\xcd\xb8\xe9\x13\x94\xbb\x48\x6a\x3e\xdf\x91\x24\x47\xed\x5d\x12\x43\xa0\xcc\xf7\xf4\xd2\xb1\xa4\x87\xd4\x8e\x39\x82\x97\x76\xec\xba\x00\x83\xff\xa3\x60\x59\x5c\x29\x41\x59\x3c\xcc\x43\xda\xef\x6e\x26\x96\xf8\x50\x16\xa3\x8e\xe0\x65\x31\xbc\xe6\x23\x35\x9f\x3d\xba\x52\xba\xa8\x2b\x3f\x6d\x13\x2a\x4a\x95\x5f\x0d\x74\x4b\x57\x7e\x3e\x0c\xbb\x04\x56\xd0\x16\x44\x2d\x71\x08\x1b\xaf\x69\x98\x01\xe1\x07\x04\x1f\x25\xf4\x16\x81\xdb\xc2\xb6\x05\xdd\x21\xe4\x88\x7e\xd1\xa3\x7a\x45\x7b\x6c\x1e\x87\x72\x90\x89\xeb\x40\x65\xe1\xb6\xfa\xa1\xd0\x8a\x7b\x9f\x99\xa2\x5a\xf2\xb0\xe8\x92\x6d\x41\x94\x4a\xe4\x81\x82\xb5\x77\x60\x5c\x99\x08\x45\x59\x3c\x8f\xb4\xd6\xa9\x09\x67\x55\xac\x92\x19\x06\x34\xa2\x81\x69\x1c\xea\xc2\x91\x30\x38\xc4\x87\x20\xc9\x25\xbd\xc3\x23\x90\x05\xb1\xb5\x9a\xef\x1d\xb4\xd1\x86\xf2\x90\x61\x7c\x4e\xa5\xf6\x8c\x33\xce\x24\x95\x0a\x99\xfa\x8c\x24\x04\xeb\x06\x3c\x8a\x6c\x15\x84\x11\xc9\x13\x05\x0b\x5c\x92\x3b\xca\x85\x16\x41\xe4\x8c\x69\x96\x44\x47\xaf\x82\x14\x04\x92\xd0\xf7\x0e\xdc\x98\x3a\xb3\x19\x96\xbf\xd0\x94\xaa\xee\x1c\x13\xf3\x92\x47\xb0\xe4\xf7\x90\x12\xb6\x2a\xba\x39\x8a\x03\x6a\x8f\x23\x0a\x7d\xef\xc0\x92\xda\x80\x50\x63\xf5\x35\x56\xa0\x31\x83\xf6\x2d\xa7\xc1\x6d\x52\x02\x12\x81\xa6\x78\x60\x18\x96\x80\x5a\x47\x42\x33\x28\x9e\xbc\x96\x7f\x3e\x69\x7f\x6c\x88\x97\x44\x2e\xf5\x1e\xa2\x24\xdd\x41\xf6\xaa\x22\xfc\xee\x0d\x4e\xc3\x85\x71\x66\x28\xfb\x6c\xca\x2f\x2e\x29\x9a\x6c\x9c\x72\x96\xf0\x09\xb2\x8f\x5d\x0e\x06\x3d\x41\x36\xc8\xbc\x5e\xba\xfb\x37\x35\x0c\x57\x51\x0e\x1f\xa9\xf4\x9f\x7b\x94\x6d\x61\xdd\x1a\x7f\x8f\x2b\x5d\x6f\x8f\xd7\xf9\xe4\xf3\xfc\xe3\xdb\x8b\x09\x34\x94\xf3\xd9\xc9\xcf\x28\xc7\x21\x4a\xad\x98\x58\x0d\xe9\xf6\x55\xa3\x1a\xdb\xbd\x61\x79\x43\x13\x85\xc2\x9c\x88\x54\x7b\x06\x81\xba\x06\x40\xa6\x6c\xd4\x8b\x28\x26\xa1\x84\x7b\x04\x1d\x2b\x49\x96\x25\x2b\x88\x0c\x99\x59\xa0\xba\x20\xfa\x96\xa3\xa0\x28\x6d\x49\x4e\xa5\xd5\xb9\x11\xc2\xc4\xc1\xc7\x89\x61\x33\x72\xb7\xd2\xed\x6f\x9b\x86\x9d\xc8\x6e\x6f\x74\x88\x52\x3d\x19\xd6\xeb\x66\x06\x71\xed\xa6\x1e\x21\xf2\xa9\x39\x83\xeb\xa1\x4d\x9c\x35\xd3\x1e\xf6\xf9\x5d\x67\x5d\xd9\x34\x0c\x29\x4c\xa0\x55\x4e\x74\x15\xab\x68\x90\x27\x44\x58\x6b\x69\xbb\x2c\x74\xbe\x0a\x92\x3c\x34\x89\xda\x58\x52\x9b\x69\xb5\xbf\x59\x0a\xee\x55\xca\xb2\x6a\x9d\xcd\xa0\xa5\xf1\x32\x49\x12\xa5\xac\x32\xee\xd1\x84\x5b\xa2\x14\xa6\x99\xc9\x50\x8a\x17\xee\x63\xdd\x2a\xb1\x35\x46\x81\xd7\x06\x7b\x94\xfe\x1d\x92\x15\xb2\x77\x32\x44\x55\xf5\x17\x8a\xca\x75\x35\x73\xbf\x44\xa6\x85\xbe\x27\xcc\x24\xf9\x80\xa7\x99\x9e\x40\x6b\x52\x7a\x0a\x20\x29\x8b\x93\xb2\x16\xe2\x02\xd2\x3c\x51\x34\x2b\xdf\xc8\xee\x84\x0a\x19\xbe\x7c\xad\xce\xca\xd6\xd6\x37\x9b\x99\x06\xc0\x1b\xdd\x4f\x6a\x15\x25\xc6\xa8\x75\x69\x32\x0e\xa1\x28\x50\xf6\x61\xd7\x30\xff\xb6\xe5\xf8\x5c\xa1\xf2\xdd\xfc\xea\xdd\xa4\x1d\xca\xb6\xad\x57\x2a\xcb\xcd\x5b\xe8\x1d\xc0\xae\xd1\xfb\xf7\x4a\x06\x8e\xab\x8b\x30\xec\x88\xe2\x26\xa5\x1c\x40\x5d\xdb\x29\x78\xd9\x94\x6a\xce\xc2\x7f\x71\x3a\x18\xe6\x07\x1a\x67\x3d\x75\x17\xd9\xcd\x01\xf2\xca\x4d\xf8\xd6\xcc\x5b\x93\xee\xaf\x81\x6a\xda\xf8\xad\x8f\x38\xf9\xf2\x75\xb1\x52\x38\xa9\x87\x6e\x33\x41\x43\x2d\xad\x88\x59\x80\x35\x1b\x1e\x2d\x1d\x8c\xc4\x7c\xb9\x0b\xb4\x69\xc7\xea\xc1\x59\x8a\x57\x7e\xe5\xac\xc4\xab\x42\xfc\xd1\x75\x38\xc0\x39\xca\x00\x59\xa8\x69\x4d\x99\x6c\x0f\x08\x9e\xbf\x34\x87\x01\xd0\x9a\xe9\x93\x8b\xf3\xb2\x3a\xef\x2e\x90\x1d\x75\x4a\x2b\xcf\x74\xd8\x13\x21\xc8\x4a\xb3\x6f\xd4\x1c\x36\x8b\x70\x06\x77\x44\x50\x9e\x17\x27\x77\x50\x19\xdc\x86\xe0\x16\x6a\xff\x54\x78\x7b\xba\x6b\x8b\x76\x51\xb5\x45\xca\xb0\x5b\xa4\xaf\xba\x5f\x52\xa4\x12\x2d\x1a\x45\x93\x81\x79\xae\xd3\xb1\x4a\x50\x3b\x4f\x2d\x1b\x94\xd0\x26\xe1\x08\x8c\x50\x20\x0b\x8c\xcd\x58\x3d\x4c\xe7\x24\xf8\x69\x7e\x7d\xfd\xf9\xf2\xf5\x6f\xd7\x17\x37\x1f\xe7\x1f\x2e\x4a\x42\x7c\x38\xd1\xba\x2d\x12\x53\x31\x9e\x4a\x08\x48\x92\x60\x08\x93\x40\x20\x51\x18\xde\x10\x35\xd1\xa9\x9f\x2a\x09\xf7\x24\xd6\xee\x42\x99\x6d\x7b\x19\xf0\xb3\xcf\x17\xf3\xeb\x8b\xf3\x9b\xf9\xf5\xa0\x44\x9c\x99\xb3\x0a\xcd\x29\xa6\x77\xc8\x8a\x0c\x67\xe8\x4f\xd6\x15\xf3\x1b\x46\x52\xdc\xdc\x98\x8f\xaf\x8e\x87\xbe\xfc\x7c\x0c\xa8\x02\xff\x79\x67\x71\x52\x0f\xab\xf8\x77\x5f\x75\x18\x4b\x44\x58\x2a\x95\xc9\x93\xd9\x2c\xe4\x81\xf4\xc9\xbd\xf4\x49\x4a\xfe\xe4\xcc\xde\x62\x32\x3f\xab\x4b\x4b\x09\x51\x28\xd5\x2c\xc4\x3b\x4c\x78\x86\x22\xce\x69\x88\xb3\x7f\xeb\xb4\xeb\x2f\x55\x9a\xfc\x64\x7f\xbe\xc7\x55\xd5\x31\xab\xdd\xa5\xf2\x23\x5d\x26\x6b\x4a\xc2\x02\xd4\x9e\x6b\x2e\xfa\x68\x15\x63\x67\x6c\xcf\xe1\xea\x42\xb8\x55\x2d\xb4\xdb\x28\xb3\x19\x5c\x08\xd1\x72\xf1\xcd\xe6\x23\x57\x6f\x78\xce\x42\x9b\x1d\x75\xec\x28\xcb\x9c\xe6\xf1\x06\x44\x84\x26\xb6\x94\xa7\x2c\xec\x9e\x88\x54\xb5\xc2\x16\xf8\x4e\x65\xb8\xa3\x5e\xdf\x76\xc6\xf8\xfc\x59\xbb\x7d\xc4\x61\x1b\x94\x77\x44\xc0\x8d\xed\x66\xc2\xe9\x96\x89\xad\x2b\xc5\x72\xd1\x68\x8f\x85\x28\x03\x41\xb3\x32\x0b\x68\x5d\x1a\xac\xa2\x19\x76\xb8\x4d\x57\x47\x16\xed\xf0\xa8\xec\x4f\xae\xbd\x83\xa2\x35\x36\x09\x78\x9e\x84\xc0\xb8\xb2\x86\xe8\x20\x4c\x3c\xd3\x2d\x7b\xd2\xa9\xa8\x29\x05\x74\x5d\x9b\x2b\x0c\x2f\xc7\x9e\x8c\x0e\xb4\x31\xda\xe3\x5e\x6d\xdd\xb5\xbb\x31\x1d\xdb\xf4\xf6\xc0\xe7\xdb\x97\xb7\x71\x9f\x63\x23\xbe\xb5\x5a\xef\xeb\xf8\xb1\x55\xbb\x0b\x69\x67\xf5\x3e\xcc\xfe\xd9\xab\xf8\x8e\x62\x7f\x94\xed\x3f\xca\xf6\xbf\xb6\x6c\x7f\x62\x9d\xfd\x6c\x25\x6f\xff\x58\xe3\x7b\x5c\x73\x70\xe6\xf9\xe1\x45\xff\x9d\x2b\x80\x11\x8c\xf7\xab\x0d\x86\xaf\x40\xfc\x6d\x8a\x83\xdd\x73\x7e\xc6\xb2\x61\x37\xb3\x27\x17\x14\x8f\xb8\xb4\xb1\xfd\xc2\xc6\xce\xdc\xb7\xfb\x18\x6d\x18\x68\xc4\x01\xdb\xe8\x14\xf8\xe3\xe8\xed\x6f\x7d\xf4\xe6\xd5\x97\x0a\x4a\x37\xd5\xae\xdc\x3d\xcd\xfd\x74\x87\xe2\xbe\xba\xf5\xee\x88\x8f\xb0\xd9\xcc\x13\xad\xa1\xd5\xc5\x03\x95\x4a\x3a\x62\xa1\x58\x15\xed\x69\x5e\x82\x39\x2e\x86\x0d\x44\xc1\x1e\x7c\xed\x5f\x9d\x1b\x5f\xd9\xed\x50\xc5\xde\x0a\xf1\x9d\x48\x97\xdd\xfa\xf3\xfd\x83\x9d\x83\xaa\xbe\x70\x39\x26\xd0\x75\xa7\xf5\x6c\x41\xad\x0b\xbc\x2d\x80\xf5\xef\x02\x59\x4a\x40\x43\x3a\x71\x24\xdd\x42\xdf\x7a\xf9\x73\x49\x55\xe3\x70\xa6\xad\xfb\xb3\xde\x00\x59\x54\x16\xf6\xca\x84\x89\x1b\x65\x81\x78\xc6\x99\x22\x94\xc9\x2b\x1b\x10\x30\xec\x53\xb7\xb4\xdf\xe7\xde\xb6\x46\xd9\x6d\x74\x56\x96\x0e\xe2\x5f\x05\xcf\x50\x28\x6a\x7c\xbc\x70\x30\xdf\xab\x8f\x71\x1e\x0d\xd2\xff\x47\x3b\xfd\x9c\xbc\x0b\xaa\xba\x45\xf8\x3d\xf2\x73\xab\xea\xeb\x54\x7e\x5d\xd3\x17\xbf\xff\x1b\x00\x00\xff\xff\xa8\x4e\xb3\x4c\x2a\x37\x00\x00") func interfaceGoTmplBytes() ([]byte, error) { return bindataRead( @@ -149,11 +149,11 @@ func interfaceGoTmpl() (*asset, error) { } info := bindataFileInfo{name: "interface.go.tmpl", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x63, 0x4e, 0xd3, 0xc4, 0xab, 0x66, 0x7b, 0x85, 0x73, 0xfd, 0x9f, 0xde, 0x91, 0x45, 0xb5, 0xf7, 0xf3, 0x3d, 0x56, 0x5c, 0xf, 0x74, 0xf9, 0x43, 0x8d, 0x82, 0xc4, 0x3f, 0xf7, 0x91, 0xe3, 0xca}} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x81, 0x1e, 0xeb, 0x3f, 0xf9, 0x8a, 0x7a, 0x9d, 0xef, 0x8b, 0xac, 0x52, 0x4f, 0x3f, 0x19, 0x6b, 0xcc, 0x99, 0x1c, 0xe6, 0x9f, 0xe2, 0xdb, 0x3a, 0x78, 0xbe, 0x4a, 0xbd, 0xd, 0x67, 0xe7, 0xf5}} return a, nil } -var _tableGoTmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x3d\x6b\x73\xdb\x38\x92\x9f\xa5\x5f\x81\xe8\x26\x1e\xc9\x2b\xcb\x93\xdc\xd6\xdd\xae\x66\xbd\x55\x79\x38\x89\x2b\x3b\x19\x5f\x9c\xdd\xb9\x2a\x97\x2b\x0b\x93\x90\x85\x35\x1f\x1a\x02\x52\xec\xd3\xea\xbf\x5f\xe1\x41\x10\x20\x01\x12\xd4\xc3\x71\x52\x52\x55\xec\x98\x04\x1a\x8d\xee\x46\xbf\x80\x86\x96\xcb\x23\xf0\x43\x9c\x86\x28\xfa\x00\x63\x04\xc6\x27\x60\x06\x49\x00\x23\xfc\x7f\x08\x8c\xfe\xf7\xf5\xcb\x57\x69\x32\xc1\x37\xa3\x8b\x60\x8a\x62\xc8\x9b\xac\x56\x5d\xde\xe9\x2e\xbc\x16\x2f\x59\xa7\xa2\xa9\x7a\x1f\xa1\xe4\x55\x1a\xcf\x52\x82\x29\x7a\x41\x69\x46\x58\xbb\x08\x25\x5a\xcf\x91\xd1\x00\x5f\xcf\x29\x22\xaa\xff\x14\x92\x6a\xff\x1b\x6a\x03\xfc\x93\xea\x34\xcb\xd2\x7f\xa1\x80\xa2\xf0\x2c\x09\xd1\x1d\x22\xbf\x61\x3a\xb5\x0d\xc2\xe6\xe9\xd9\x54\x9b\xa8\x36\xb5\x73\xff\x81\xf8\x9c\x7d\x47\xd3\x66\xdf\x62\x08\x49\x16\xdf\x1e\x05\xbd\x08\xcd\x70\x72\x73\x9e\xa5\x33\x94\x51\x8c\xc8\x59\x41\x5a\x0e\xb8\xf6\xbd\x9d\x32\x17\x0d\x20\x39\x39\x6a\xe1\x6a\x34\x68\x02\x26\x27\x5e\xdb\x8c\xcf\x76\x06\x83\x5b\x78\x83\x40\x78\x9f\xc0\x38\x0d\xaf\xbb\x5d\x1c\xcf\xd2\x8c\x82\x7e\x17\x80\x5e\x90\x26\x14\xdd\xd1\x1e\xfb\xff\x24\xe6\xbf\xc5\x87\xe1\x81\x27\x20\xcd\x5a\x71\xa4\x11\xf3\xd5\x4a\x8d\xd0\x13\xa4\x20\xe6\x98\x28\x09\x59\x23\x86\xcf\x72\x09\x46\xbf\xa4\xe1\x3c\x42\x72\xf9\x2d\x97\xa3\xb7\xe9\xaf\x73\x3a\x9b\xd3\x73\x48\xa7\xab\xd5\x31\x5f\xbf\x64\xb9\x1c\xfd\x03\x65\x04\xa7\xc9\xc5\x7c\x32\xc1\x77\xab\x55\x2f\xef\x7f\x2e\x66\x2f\x01\x1c\xb3\x47\x05\x00\x20\x1b\xde\x60\x3a\x9d\x5f\x8f\x82\x34\x3e\x86\x5f\x08\xfb\x77\x44\xc2\xdb\xa3\x9b\x94\xfd\xb7\x42\x92\x24\xa5\xfa\x4a\x7e\x11\x45\xe9\x97\x5f\x17\x28\xfb\x92\x15\x33\xac\x07\xc9\xfe\xa1\x2c\xb3\x4e\xbc\xb6\x2f\x41\xd9\x02\x07\xe8\x38\xe7\x65\x03\xf6\xe5\xe6\xea\x3f\x30\xe7\xd8\xba\x00\xf0\x04\x06\xbc\xb3\xa4\x09\xcd\x60\x42\x60\x40\x71\x9a\x90\xd3\x04\x5e\x47\x28\x2c\x2d\x92\x76\xe3\xa0\xbb\x59\x86\x08\xe3\x68\x3e\x88\x95\x3c\x37\xe9\x51\x3a\x43\x09\x9c\xe1\x63\x42\x33\x2e\xbf\x83\x6e\x77\x01\x33\xf0\x19\xf0\x25\x3c\x89\xe9\xe8\x35\xa4\xe8\x13\x8e\xd1\x72\xd5\xed\x1e\x1f\x83\xe5\x52\x57\xfb\xab\xd5\x27\x86\x2d\xc8\x10\x1b\x10\x25\x94\x00\x3a\x45\x60\x4e\x50\x76\x14\x70\xe4\xe7\x19\x6f\x30\x53\xf2\x0c\xd2\x09\x6f\x53\x06\x04\x28\x6b\x38\xea\xd2\xfb\x59\xf5\xa5\x18\x85\xd0\x6c\x1e\x50\xb0\xec\x02\xf0\x9a\x4f\xf5\xf5\xcb\x17\xe7\x67\xb9\x14\x18\xc4\x1d\x69\x0d\xba\x00\x9c\x67\x68\x82\xef\x80\xfe\x11\xcb\xa7\x0b\x00\x87\xcd\xc7\xa9\xbe\xfb\x88\x60\xf8\x0a\xce\x60\x80\xe9\xfd\xdf\x13\x4c\x09\x00\x38\xa1\xff\xf5\xc7\x2e\x00\xbf\x31\x79\x35\xdf\x89\x57\x82\x4e\x61\x78\x5d\x9e\xc4\x79\x86\x63\x98\xdd\xbf\x47\xf7\x65\x7a\xcd\xc4\x1b\x70\x8b\xee\x19\x79\x60\x95\x38\x38\x51\x53\x96\x24\xaa\x1f\x40\x23\x15\x63\xff\xf1\x21\x88\xd2\x74\x06\xd2\x05\xca\x8c\xd1\x60\xa1\x7c\x60\x12\x02\x18\x86\x0c\xa1\x18\x40\x02\x26\x18\x45\x21\x9b\x14\x47\x51\x02\x3c\x3c\xe6\x52\xc4\x60\x66\x30\xb9\x41\xe0\x87\xcf\x43\xf0\xc3\xec\x96\xe9\x54\x6d\x55\x2b\x5c\xdf\xa3\x7b\xe1\x02\x00\xd9\x4f\x73\x13\x7e\x98\xdd\x8e\x94\xf2\xcb\x27\xba\x5c\x82\x9b\xf4\xd3\xfd\x0c\xbd\x49\x33\xf5\x52\x5f\x0c\xd6\x5e\xff\x54\x4b\x73\x31\x66\x8a\xcb\xd6\xa8\xf7\x4f\x73\x2d\xac\xba\xdd\xe5\x32\x9f\xc5\x0d\xc1\xae\x29\xbc\x8d\xd2\x6b\x18\x5d\xa0\x20\x4d\x42\x98\xdd\x4b\x15\xce\x20\xe4\x6c\x2e\x98\xb0\x5a\xbd\xbd\x38\x33\x27\x79\x43\xf0\x88\xf7\xc9\x71\x2d\xf1\x9e\x61\x5b\x69\xf3\xf6\xe2\x4c\x67\x73\xbb\x01\x0c\xde\xe7\x13\xbc\xe5\x66\x8f\x37\xae\xf0\xe4\x48\x07\x77\x4b\xd6\x61\x8a\xad\x57\x85\x29\x96\x46\x9c\x29\xb9\x16\x2f\x38\x53\xfc\xdf\xb1\x96\x74\x2a\x5a\x96\x0b\x24\x80\xd0\x34\x43\xa1\xdf\xc2\xd1\x49\x26\x6c\xe2\xa8\xdc\x84\x89\xcb\x64\x9e\x04\xa0\x4f\xed\xda\x69\x00\x82\x0c\x41\x8a\xfa\x01\xbd\x03\xd2\x2f\x18\xbd\x12\xbf\x07\x00\x65\x59\x9a\x71\xf8\x78\x02\x3e\x0f\xd9\xdf\x8c\x1f\x54\xd7\x53\xa3\x57\x1c\x00\x87\x26\x3c\x04\xde\x99\x01\x1c\x82\x83\x9c\x98\x7a\xab\xb3\x64\x36\xa7\x4b\x4e\x41\x45\xd8\xd7\x68\x82\x13\xcc\x4d\xc9\x18\x5c\x5e\x1d\xaa\x7e\x96\x16\xcb\x2e\x70\x7c\xb8\x1f\x05\x73\xef\x19\xea\x5c\x23\xb6\x55\xa2\x7b\x26\x36\x58\x52\x0a\x19\x20\x2e\x87\x02\xb4\xea\x54\x20\x62\x08\xc8\x18\xc0\x2f\x64\x24\x3c\xa2\x7e\x4f\xe1\xc4\xe4\x66\x30\xac\x76\x61\x12\x5a\xee\x22\xcd\xc2\xeb\x97\xb5\xe2\x5b\x81\xba\x1a\xd6\x4e\x47\x99\x53\xd5\x52\x2d\x2a\x93\xe8\xea\xf1\x69\x84\x62\x94\xd0\x7a\x8a\x6b\x2a\x55\xae\xd7\x66\x95\xda\x8e\x7c\xb6\x25\x38\x70\xcf\x55\x47\x0e\x4f\x00\xfa\x9d\x43\x78\x8f\xee\x19\x35\x41\xef\xdd\x8b\x8b\x77\x3d\x9d\xf5\xf2\xcd\x58\xfe\xa9\x0d\xaf\x53\x84\x35\x79\x07\xc9\xd4\x73\x60\x14\x11\x64\x1b\xfd\xe3\x8b\x0f\x6f\x4f\xd7\x1c\xfe\x23\xa3\xb4\xef\xf8\x05\xb3\xd7\x10\x8c\x72\x0b\x16\x76\xbc\xbd\x38\xb3\x45\xb5\x1e\x26\xc7\xc1\x18\x19\xce\x70\xb8\x3f\xe5\xed\xec\x50\x4c\xf9\xb4\xb5\xf1\x92\xd1\xb5\x0c\xa6\x84\xa2\xe0\x2b\xb3\x55\x59\xb5\x15\xab\xa6\x4b\xa9\x0c\xa7\x70\x9a\x8c\x35\xbd\x58\x3c\xd5\x27\x50\x3c\xb5\x6a\x07\x3e\x4e\xd1\x66\x64\x36\x2f\x8d\xab\x71\x74\xe3\xe5\x5e\x43\x5a\x6d\xf9\x5b\xcc\xb5\xea\xe0\x0d\x7a\x67\x5a\xc1\xc4\xde\x47\x3f\x80\x5d\xe8\x08\x13\x0d\x7f\x6d\xd1\x0e\x19\x5f\x8d\x51\xc2\x46\xd7\x1d\xa0\x5e\x7f\x78\xf4\x5f\x19\x8b\x60\x81\x59\x88\x87\xc2\x4f\xd3\x2c\x9d\xdf\x4c\x67\x73\x5a\x5a\x0f\xd5\x06\xba\xd4\x54\x82\x9b\xb1\x20\xc0\x19\x0b\x63\xfa\x74\x54\x79\x6f\xcc\xbe\x1a\xff\x8c\x8d\xde\xd5\xf7\xb6\x95\xb4\xb1\x3a\xd5\x5a\x6c\x46\x91\xf5\xa9\xb1\x36\x25\xe4\x94\x54\x00\x6a\xac\x4c\x3a\x52\xcf\x79\xf3\xd5\xe0\x67\xee\x35\x3e\x39\x01\x09\x8e\xe4\xf2\xcf\x10\x9d\x67\x09\x60\x71\xfa\x29\xf3\x30\x27\xfd\xde\x04\xe2\x08\x85\x80\xa6\xd2\x1f\x15\x71\x35\x78\xfa\x94\x8c\xc1\xd3\xa7\x5f\x7a\x43\xa0\x41\xe6\x8e\xe8\x80\x41\xef\x2a\x60\x09\x8e\x3c\x9c\x5d\x02\x17\xa8\xfc\xca\xe6\xfa\x0e\x41\xec\x72\xa9\x75\xaf\x38\x84\x14\x2a\xaf\x18\x25\x41\x1a\x56\xa1\xc7\x03\xe1\x3e\xbb\xa8\x80\xb2\x4c\xce\xa4\x10\x0f\x3c\x69\x4c\x36\x49\x6f\xbc\xec\x8c\x9f\xcf\xe9\x19\x45\x71\x8d\x23\x2e\x5b\x68\x4e\xb8\x1f\x27\x01\x60\xdd\xa4\xca\xe1\x13\xe7\xec\xed\x96\x26\xa2\xc9\x38\x53\x69\x8f\x08\x57\x00\x4e\x55\x82\xc9\xb0\x1b\x64\x0c\x62\x38\xbb\x14\xe9\x93\xab\x43\xf1\x3b\x5f\x60\xeb\xe6\x0c\xd8\xa7\xf7\x1f\xcb\x25\x98\xcf\x66\x28\xb3\x87\xf6\x55\xbb\x6e\x6b\xa5\x56\xac\x5d\xb5\xbc\x4a\x93\x90\x87\x45\xc5\xec\x4c\xb8\x16\x55\xa5\x4d\x0a\x7b\x4e\xea\xc8\x1a\x2a\xe5\xd9\x51\x06\x88\xbb\x70\xe0\xc5\x87\xd7\x79\x4c\x6c\xef\xa2\xa2\xb2\xcf\x49\x4a\x3f\xa3\x3b\x4c\x28\xe9\xd7\x13\x6a\xe0\x18\xd9\x3d\x88\xa4\xff\x60\xd8\xed\xac\x06\xdd\x4e\x79\xf9\x75\xd8\x13\x88\xb2\x6c\x08\x52\x3e\x77\x94\x65\xa3\xbe\x48\xd0\x0a\x95\x34\xf8\x99\xbd\x61\x2d\x3b\xe4\x0b\xa6\xc1\x94\x37\x1f\xbd\x4a\x43\xd4\x1f\x88\xe7\x9d\x00\x92\x22\xc3\xce\xba\xb1\xb7\x8a\x1d\x30\x7a\x35\x45\xc1\xed\x1b\xae\xd8\x4e\xef\x02\x34\xe3\xae\x1f\xef\xd9\x91\x4b\x46\x74\x2b\xab\x8c\x17\x51\x86\x60\x78\x7f\xca\x49\x23\x86\xea\x74\xd6\x93\xc3\xbc\x6f\x43\xfe\x6a\xcc\x58\x86\x27\x00\x17\x7b\x50\x4d\xc9\xab\xe5\x12\x04\x79\xdb\x7f\xc0\x68\xde\xd0\xa1\x17\xf7\x44\x27\xa9\x15\x96\xcb\x42\x10\x3e\xa5\xbf\xb0\xd9\x7b\x41\x19\xe5\x60\xf8\x3a\x18\x6a\xc4\x91\x2b\x83\xff\xbd\x72\xf3\xe7\x23\x22\xe9\x3c\x0b\xd0\x87\x94\xbe\x49\xe7\x89\x8b\x33\xba\x6d\x12\xa6\x28\xcd\x00\x66\x9e\x3d\xdf\x0a\x98\xb0\xae\xcc\x32\x11\xd3\x32\x0d\xba\x72\x74\xf6\x4f\xd3\x8b\xec\x6f\xcd\x50\x95\x85\x38\xcf\xeb\x59\x35\xff\x4b\x48\x83\xe9\x6f\x4a\xf5\x7b\x58\xb8\x17\x59\x06\xef\x7f\x9d\x78\x1a\x3a\x02\x2e\xaf\x1a\x6d\x1d\x5b\x30\x11\x4a\xfa\x31\x19\x80\xbf\x82\x18\xde\xe5\xf2\xc6\xb1\x63\xda\x96\xf0\x55\x61\x21\x5f\x0d\x46\x20\x43\x01\xc2\x0b\x14\x82\xa7\x4f\x43\x80\x39\x14\x9a\xf2\x39\x0c\xc1\x97\x29\x0e\xa6\x00\x13\x70\xc3\x3d\x82\x0c\xd0\x29\x14\x59\xdd\x18\xde\xe1\x78\x1e\x83\x74\xc2\xfa\xf5\x86\x39\x66\x43\x3b\x62\x03\x46\x7e\x63\x06\x27\x27\xe0\x27\x1d\x5d\xc6\x13\xde\xe6\x9a\x75\x62\x2b\x2b\x86\xb7\xa8\xaf\xc7\x48\x9c\x01\x1f\xd1\xef\x73\x44\xa8\x1a\x70\xd0\xed\x4c\x98\x5c\xb0\x1e\x62\x71\x0a\x32\x78\xf9\x05\xe4\x12\x5f\x0d\x84\x2a\x2a\x29\x27\x43\x72\xb8\x28\x71\xbc\x2e\xf1\x15\x38\xd1\xac\xa3\x8e\x12\xef\x76\x3e\xa7\xf2\xcf\xb1\x69\x44\xf5\x46\x1d\x61\x1a\x85\x55\x64\xd2\x3a\x14\x63\xac\xba\x1d\x9a\xc8\x4d\x71\x4d\xa2\xc5\x0c\xa5\xca\x4c\xe7\xd4\x91\x04\x2c\x84\xb4\xc1\xa4\x9b\x0d\xa5\x65\xef\x74\x3a\x12\x45\xce\x30\xc3\x1e\xbb\x98\x20\x26\xc3\x51\x1e\x03\x4e\x1f\x6d\x3a\x65\xaf\xd3\xbe\xb0\x4d\x5c\xd8\x72\x5e\xf4\xa4\x6f\xd9\xe9\xac\x54\x4c\x96\xce\xe9\xe8\xef\xc9\x2c\x4b\x03\x44\x08\x0a\x85\xb0\x4b\xd0\x07\x07\x5c\x16\x6c\x4d\x2e\x39\x6e\x57\x6c\xbd\x08\x61\x93\xd2\x75\x62\x05\x28\x5b\x17\x03\x8b\x1e\x19\x82\xb7\x8a\x3f\xad\x5c\xdd\x10\x45\x88\x3e\x32\x55\x50\x8b\x93\x43\x19\x88\x3e\xdb\x56\x07\x00\x3c\xa8\x42\xe8\xdc\xa2\x7b\xb5\x72\x2a\x1b\xb2\xa3\x5f\x60\x46\xa6\x30\xfa\x05\xce\xfa\xb5\x1b\x64\x0c\xd2\xda\x8e\xc0\x83\x78\x01\x6f\xb2\x34\xe6\xfc\x6d\x32\xe4\x4c\xfb\xf5\x4a\x1e\x01\x73\xca\xf2\x66\x67\xe4\x3c\xc5\x09\xe3\x73\x03\x0a\x87\xca\x1b\xe0\x30\x47\x8d\xd3\x34\xbc\x07\xc3\x73\x58\xf9\xa9\x63\x6f\x7d\xfc\x9a\x8b\xae\x45\x25\x1b\x2f\x84\x22\x7b\x8f\xee\xc7\x80\x49\xc9\x5e\x27\x7f\xbb\x3a\x59\x3f\xcb\x22\xc2\x39\xee\xd9\x9a\xd1\x26\xd7\x26\xd5\xc7\x6f\xd2\x8c\x67\x8e\x0d\x79\x6f\x5a\xd6\x0d\x36\xe0\x06\x51\x2f\xcd\x5f\xdd\x1b\x37\xf6\xce\xb8\x86\xb1\xcf\x45\xed\xc5\x2e\x60\xc6\x25\xb5\xd4\xd3\x6b\x1b\xb6\xdc\x65\xd8\x35\xe3\xbb\x01\xe8\x1f\x3a\xcc\xd2\x50\x98\x25\x1e\x92\x7d\x7d\x1d\xfb\x18\x02\xad\x4a\x9c\xa5\x38\xd3\x46\x17\xda\xa3\xe6\x42\xd8\x87\x5a\x58\x43\x1c\xfa\xe7\x2d\x6a\xca\xef\xc8\x16\x4a\xe3\x70\x25\x28\x3e\x52\x15\xfa\xe4\x7b\x3a\x9d\x57\x69\x42\x30\xa1\x28\xa1\x1f\x11\x0c\x45\xd3\x97\x69\x1a\xf5\x69\x36\x47\x79\x12\xc0\x2b\xb1\xe6\x39\x69\x3d\xbf\xf5\x90\xd9\x05\xcf\xe8\x95\xe3\xba\xc5\x10\xb6\x3a\x77\x75\x60\x4f\x3a\x51\x19\x22\x23\xc6\x4a\xe5\x4a\x69\x19\x4e\xde\xdb\x9e\xea\xc8\xe7\x21\xda\x6f\xa2\x83\xca\xa7\x74\xca\x3a\x85\xaf\x3c\xa7\x92\x1a\x76\x6d\x09\x36\x9e\x97\xed\x02\xd6\xcd\x9d\x0f\x2e\xb2\xbb\x4c\xed\x20\x6b\xac\x97\x53\x67\x08\x0e\xe2\x9a\x84\xb8\x22\xb3\x1c\x57\x3e\x3e\x88\x87\xb9\xcf\x2f\xb4\x47\x59\x84\xa5\xf2\xe2\xe6\xe3\x22\x80\x89\x4f\x9a\x20\x80\x49\xf9\x15\xb1\x47\x05\x98\xad\x4e\xc6\xbf\x0b\x5b\x1f\xbe\x76\x87\x60\x92\x00\x36\x62\x3f\x06\x6e\x4d\x1d\x41\x52\x31\x47\xe0\x3a\x4d\xa3\x81\xfc\x59\x24\xd6\x19\x7a\x1c\x32\x23\x6a\xa1\x2f\x2e\xf2\xc7\x95\x64\xb0\x48\x2d\xd6\x65\x84\x9d\x3a\xe2\x09\x9f\xe0\xe8\x35\x26\xac\x87\xd9\x4c\xf6\xfd\x1b\x8e\x31\x1d\x17\x89\x45\xd1\x83\x3f\x1d\xca\xe4\x3d\x53\xea\xfc\xe9\x05\x85\x19\xc5\xc9\xcd\x8b\x09\x73\x5e\x35\x36\x4b\xfd\xc3\x57\x20\x23\x2e\xc4\x09\xf9\x90\x26\xd5\x13\xb5\xad\x3c\x00\x86\x0e\xba\x0b\xa2\x39\xc1\x0b\xc4\xc7\x7e\xef\x6b\x06\x2d\xf8\x8a\x4c\xab\x6d\xb7\xc2\xba\x6b\x23\x18\xc6\x13\x1c\x38\xb9\x29\xf0\x00\x84\x01\xe5\x47\xf5\x98\xa7\xca\xb8\x99\x6b\x1a\xa5\x03\xfb\x83\x81\x5a\x65\xa5\x85\x77\x7c\x0c\xe2\x39\xa1\x60\x96\xa5\x0b\x1c\x22\x90\x26\xd1\x3d\x8f\xf4\xe4\xe1\xbe\x20\x4d\x08\xc5\x74\xce\xd0\xe6\xcf\x39\x4d\x79\x57\x25\x38\xa3\xd3\x32\x51\xc0\x89\x91\xe6\xaf\x9e\x30\xe2\xd6\xd5\xb6\x41\xad\xe9\xa5\x56\x07\x5c\xac\xb9\x72\x97\xe9\xb7\xec\x66\xe7\xdb\x08\xae\x53\x68\x7a\x48\xe1\x9e\xc5\x85\x61\x3a\x97\x4b\xd3\x9b\x38\x87\x37\x0d\x78\xf4\x2c\x72\xd2\x5b\xad\x9a\x0e\x1d\x99\x5b\x40\x0d\xf3\xb0\x09\xf1\xa5\xb3\xfd\x55\xcd\x88\xe5\x9d\x6b\xc7\xcb\x95\x5c\xb6\x34\xa5\x30\xfa\x88\x82\x34\x0b\xc9\x79\xee\xfc\x33\x16\xf3\x53\xb1\xfd\x9f\x06\x52\xfd\xe3\x24\x41\xd9\x69\x96\x09\x1d\xd5\x05\x76\x8f\x87\xe9\x27\x46\x50\x52\xf1\x79\x94\x5c\x0e\x85\x9e\x4c\xe7\x14\x1c\x1a\x7a\x4d\x9c\x50\x17\x5a\x92\x33\xa5\xd0\x8c\x72\x09\xf2\x94\xc8\xb0\xde\xd4\x10\x1e\xf6\xc8\x3c\x87\x7b\x2d\xab\xe9\x9c\x58\xd6\x33\x87\xcc\x96\x96\x63\xc5\x16\xaa\x00\x46\x04\x29\x72\x02\x50\x4a\x7d\x60\x99\x0a\x92\x43\x4e\x74\xb5\x89\x2a\x28\xe9\x66\xd4\x68\x38\xfa\x0d\x62\x4e\x45\x9b\xe5\xac\x4c\x47\xdf\x85\xb4\x20\x5a\x20\x5b\xfc\xc6\xe4\x6f\x90\x50\xee\x59\xf0\xe3\x4d\x39\x03\x0e\x0e\x00\x66\xee\x0c\xf3\x6f\xf8\x5c\x06\x47\xcf\x8a\xc9\x90\x69\x3a\x8f\x42\xc6\x64\x9c\xcc\xb9\x7b\x32\x49\xfa\x07\xbc\xdd\x25\xbe\x1a\xea\x50\x07\x3f\x83\x27\xa5\xe6\x05\xf6\x16\x14\x73\xc4\xac\xc2\xf9\x87\x3f\xc8\xb7\xc7\xc7\xfc\x10\xfe\x14\x09\xf3\x04\xd2\x09\xc8\x44\x5b\x30\x85\x0b\x04\xae\x11\x4a\x98\x47\x44\xc4\xbe\xfa\x24\x19\x82\x30\x4d\x7e\xa4\xfc\x19\x80\xc9\x7d\x9c\x66\x28\xef\x32\xb2\x72\x49\x8b\xa8\xed\x0b\xe5\xe4\x04\x1c\xea\xed\x3d\xa6\xb5\xd2\x3d\x1e\xe6\x9f\xe7\xdb\xc8\x7c\x68\xc9\x47\x9b\x77\x94\xbf\x34\xf7\xfd\x19\xbf\x2b\x81\x77\x6e\x66\xdf\x41\xc2\x0f\xc0\x30\xed\xdf\xa8\xb3\xf9\x99\x22\xa6\x1c\xe7\x79\xc9\x4b\xee\x77\x62\xf5\x87\x1f\x90\x29\x24\x53\x36\x64\xde\xb5\xa1\x5b\x51\x9f\x94\xe5\xc8\x7a\xf6\x7c\x56\xe9\x69\x16\x4a\xd9\xd3\x0c\xf9\xe1\x22\x6f\x37\x43\x3b\x85\x94\x9f\x05\xfc\x68\x1d\x8f\x9f\x0c\xb4\xa0\x52\x22\xcc\x6e\x90\x54\xc7\xb6\x72\x1c\xdf\xd9\x46\xe3\x28\x56\xf1\x50\x15\x75\xbb\xce\xd8\xf0\x51\x92\x34\xe1\x3d\xab\xc3\xe4\x6f\x6c\x58\x98\x71\xbf\xa5\x85\x36\xf7\x0f\xe5\x11\x8a\xc9\x3b\x06\x5f\x15\x3b\x90\xf2\x5c\xa6\x05\x86\x3c\xa5\x69\x0d\x2e\xea\xb2\x4e\xe4\xe5\x3d\x7b\x54\x5d\x5d\xab\xd5\x39\xcc\x08\x7a\x83\x23\x8a\x32\xd2\xff\x7d\x8e\x58\x1c\x33\x33\xac\xe3\xff\xa8\x87\x5a\x30\xf2\xb6\xd5\x20\xbc\xf7\x40\xea\x13\x66\xa6\x3e\x0f\xc1\x84\x8f\x29\x52\x2a\x85\xcd\xe2\xca\xec\x4d\xf1\xaa\x30\x60\x32\x52\xd7\xba\x95\x3c\x13\xcb\x91\x91\x6a\x08\x6b\xa7\xbe\x72\x59\x44\xd4\x7f\x5d\x89\x9e\x1a\x82\x5b\xa5\x76\x0b\x02\x8e\x5c\xa7\x5d\x2e\xf5\x63\x29\x65\x48\xbd\x2b\x70\xa2\xbb\x8b\x44\x1e\x2b\x6c\x8b\xd1\x60\x60\x6c\x72\xf3\xf7\xaf\xb5\x33\xed\x45\x70\xe2\x71\xc6\xdd\xe2\x13\x6b\x60\xdf\xa6\x39\xc0\x96\x69\x46\x05\x8a\xfb\x2d\xc3\x62\xef\xa1\x24\x13\x56\x8e\x97\x84\x03\x98\xc7\x49\x2b\xd3\xed\x5d\x54\x0e\x71\x96\x9a\xcb\x69\xf4\x4a\x05\x6c\x95\x6e\x4d\x3c\x16\x88\x5d\x32\x18\x17\xb3\x0c\x27\x74\xd2\xef\x8d\x9f\x3e\x25\x9f\x17\xec\x85\xd8\x20\x5b\x9b\xab\x43\x80\x07\xe6\xa6\x47\x53\xf4\x64\x46\x1f\x21\xa4\x88\xe2\x18\x7d\x4a\x05\x75\xd8\x0c\xe5\x2b\x93\xfa\xa3\xfe\x72\xa9\x91\x85\x09\x54\xe5\x14\x6b\x95\x9c\xfa\x29\x5a\x07\x4d\xbf\x3f\x7a\xee\x92\x96\xdf\x13\xad\xca\x44\x11\x88\x78\x91\xa2\x1c\x54\xda\x64\xcd\x5c\xee\x1f\x2a\x72\xf6\x0d\x51\xee\x83\x41\xb7\x02\xa7\xd6\x72\xd5\x8e\x66\x2f\xbf\x65\x9a\xbd\x1c\x83\x26\xea\x34\xd0\xa6\x74\x66\xde\x7e\xe8\x53\x8f\xa2\xcc\xb0\x67\x9b\x3e\x59\x43\x22\x78\x0d\xdf\x6b\xeb\x19\x62\xd3\x55\xb5\x84\x23\xcf\x72\x92\xe1\x09\x28\xa7\x3a\xf5\xc0\xd6\x9d\xb5\x1d\xd4\xa5\x3e\x5f\xc1\x04\x90\x19\x0a\xf0\xe4\x5e\xe4\x27\xd3\x04\xb1\x10\x5c\x1b\x23\xcd\x80\x99\x34\x2b\x25\x3c\x35\x05\xab\xc2\x6e\x53\x2a\xf3\x50\xaa\x92\x02\x6b\x39\x93\x75\x26\xb2\x2e\x3e\x7c\x93\xa9\x9a\x30\x74\x24\x7b\xeb\x7c\xe5\xad\x07\x86\xf9\x7a\xfa\x21\xdc\x9a\x27\xaa\x39\x71\xa1\xd3\xdf\x73\x70\xb7\xb2\x53\x7e\x72\x02\x7a\x3d\x4b\x0e\x45\xe3\x16\x8b\x69\x79\x5e\xdd\x0b\x60\x00\x93\x24\xa5\xe0\x1a\x01\x14\xcf\xe8\x7d\x6f\x60\xe8\x90\x0a\x23\xd4\x1f\x5a\x18\x66\xec\xbf\x14\x91\x58\xbb\xd3\xf8\xeb\x1c\xbc\xd7\xa3\x14\x19\xaf\xfb\x9c\xa0\x77\x36\x35\xab\x57\x9c\xe6\x64\xdc\x66\x93\xa0\x37\x5e\x2e\x41\x00\x63\x24\xe8\x5f\x83\xa6\xbf\xd3\x62\x5a\x85\xf5\x44\xd5\x85\x48\xc3\x60\x8d\x82\x5c\xdb\xd5\xb5\xb1\xb1\x06\x32\xc0\xb2\x6d\x51\x77\x0a\xc2\x3e\x84\xd8\xb8\xe8\x81\x8a\xe9\xb5\x4d\x20\x77\x4d\xb4\x03\x68\xa7\xc9\x3c\xde\xfe\x4c\xa4\x47\x62\x5b\xbf\x2e\xf8\x55\x1f\xd5\x81\x7f\x4b\x54\x5a\xe1\xe0\x81\x82\x6b\xef\xc5\x46\xe7\xaa\xa0\x99\x2e\xb3\xcb\x07\x9d\xf4\x7b\xdc\xb1\xdb\x1e\xfd\x5c\xc5\xd2\xf2\x97\xd8\x73\x0e\xd1\xdd\x9b\x34\xfb\x02\x33\xdb\xce\x31\x22\x01\x4a\x42\x16\x4c\xd8\xb7\x9a\x41\x8b\xcd\x66\x63\x2f\xd9\x48\xc2\x0b\x55\xa1\xb9\xc4\xe2\xad\xb1\x5b\xd2\x2d\x4c\xac\x8f\x73\x54\xdd\xb4\xa6\xcc\x08\x99\xdb\x2b\xa6\x74\x6d\xe0\xa9\xd8\x21\x17\x94\xd7\xa6\xf6\x1e\xdd\x5b\xea\x9a\xcc\xd4\x94\x8f\x81\x00\x27\xc0\x53\x45\xf3\x72\xc2\xfc\x94\x1f\x58\x23\x93\xe6\xa4\x40\x39\xa5\xc6\xcd\x94\xbb\xf5\xc0\x63\x74\x19\xf9\x94\xcc\x4f\x3d\x06\xf5\x16\xc8\xdf\x9d\x6e\x52\x2a\xf5\x9a\xda\x81\x63\x79\x8f\xb9\x5e\x6b\x37\xeb\xbb\xf6\xc9\x41\x27\xf1\x9a\x46\x58\x2b\xab\xb9\xce\x68\x2d\x52\x8b\xce\x8e\x4d\x49\x46\xef\x6c\xdd\xe1\x9a\x4a\xc0\xad\x8a\xdb\xe6\xef\xbc\x12\x61\x3b\x44\xd3\x8a\x06\xd9\xe9\xb0\x75\xf6\xb5\x4d\x4a\xaa\xce\xb6\x72\xe3\xfa\x30\xdc\x75\x65\x7f\x5e\x8e\xd7\x35\x31\x9b\x51\xcf\x3c\x1d\xa2\x99\xba\xc2\xc0\x2b\xe3\xf5\x35\x6d\x15\xaf\xb1\xf5\xb1\x3c\xe0\x2f\x65\x90\x4d\x66\xc7\xb0\x80\xdf\xca\x2c\xff\xda\x7a\x96\xde\x67\xf6\x4a\x86\x78\xa3\x13\x65\x0d\x76\xbf\x39\x46\x6c\x67\xa3\x1b\xac\x72\xe5\xdc\x97\xa7\x65\xe6\xc9\x1c\xdd\x38\xdb\x8d\xf1\x6e\x0c\xf0\xae\x8d\x6e\x2b\x33\xbb\xd6\xfe\x9d\xec\xd4\x50\xe6\xe4\xe7\x1e\xd8\x8d\xf5\x39\xcd\x2c\x86\xd0\xc2\x45\x5f\xf5\x6a\x2a\x75\x97\xef\xe5\xed\x39\x6c\x17\x93\x24\x6c\xdc\x98\x69\xde\x04\xdc\x2d\x53\x1e\x0d\x43\xbe\x1a\x33\xd4\x53\xab\xb3\xb4\x5c\x6e\x40\xfb\xc3\xe5\x92\x0f\xbb\xed\x89\x94\xb5\x82\xff\x6e\x5f\xa3\x73\xb5\x25\x54\xdb\xed\xa7\x29\x9f\x6a\xad\x71\x87\xae\x90\xbd\xee\xaa\xb9\xfa\x74\xac\x4f\x4a\xd4\x34\x78\xd5\xe3\x5c\xa5\x98\xb4\xad\xc5\xab\xcb\x1a\xd6\x18\xbc\xba\xf8\xb3\xbd\xd9\xf3\xcc\x29\x6e\x66\xf9\x1a\x07\xd9\xbd\xe1\xf3\xd5\xb2\x9e\xf4\xd8\xae\xed\xf3\x4d\x1c\xba\x19\xbf\x45\xf3\xd7\x0a\x99\xad\xd8\xbf\x9d\xf3\xe6\x31\xf1\xe5\xab\xf2\x64\xe3\xdd\x85\xb5\x2d\xa8\x0b\xba\xbf\x01\xf5\xa3\x81\x9f\x3b\xf2\x95\x31\x7e\x58\x83\x7f\xb8\x1d\xda\x7a\x9b\x5e\x55\xb7\xe8\x7b\x9c\x57\x55\x71\x56\x4f\xbf\x8a\x4a\x79\x75\xb8\x40\xbc\xd2\xe2\xff\x27\xc6\x96\x35\x1d\x6d\xe5\xec\xaf\xf4\x91\x06\xd5\x2c\x44\x65\xfc\x93\xea\x7e\x56\xb9\xcd\x00\xd8\x8e\x1e\xb4\xa8\xfd\x99\xc1\x1b\xf4\x26\x29\x8a\x7f\x3a\xe2\x01\x2f\xf9\x98\x27\x81\x40\x5c\x94\xef\x94\x4f\x2d\xd7\x17\xf5\x74\x3a\xfe\x1c\xe2\xf5\x1e\xbf\x26\xd1\x3d\x80\x84\xcc\x63\x04\x60\x22\x36\xf5\x39\x7a\x20\x46\x30\x21\x20\x49\x81\x2c\xea\x20\xf3\x88\x12\x59\x1f\x92\x21\x00\x33\xc4\x5e\x8a\x93\xac\x04\xc0\xd9\x2c\xc2\x28\x2c\x8e\x27\xf4\x5d\xdc\xe7\xd5\xbc\xff\xfe\xb7\x8b\xfd\xfc\xc4\xc2\x20\xbf\x71\x41\x23\x84\x2c\x41\x2a\x2e\x56\xe9\x94\x4a\x42\xd8\x03\xed\x18\x82\xa1\x31\xa4\x34\x6e\x00\x2e\xbf\xd1\xc3\xaf\x64\xaa\x3a\x50\xbe\x28\x2c\xf5\x46\x85\x34\xe8\xc5\x46\x96\x8a\xa8\x4e\x67\x0a\xc9\x2f\x8c\x1d\xe3\x13\x51\xe8\xd2\x29\x5f\x0e\x83\xd5\x65\x39\xfc\x32\x9a\x5c\x48\x4e\x44\x7b\x59\x08\x9e\x43\x39\x01\x18\xfc\xc5\x2c\x46\xca\xaf\x3a\xc3\x13\xf0\xc4\xac\x3e\x7a\x22\x7b\xe5\xd5\xe4\x25\x62\x75\xbe\xdb\x12\x23\xa3\x6e\x5d\x50\x7d\xd5\xed\x76\xac\xe5\x7a\x7c\x89\xda\xeb\xf5\x74\x65\x24\x38\xbe\xf9\x0d\x02\xdf\xc8\xe5\x01\x3b\xb8\xfa\x4e\x5f\x93\x78\xa2\x2d\xa1\x2a\x91\xd4\x3b\xce\xb7\xd2\xf5\xae\x8d\xe7\x1d\xcb\xd7\x5f\x7d\x1f\xb7\x9f\xa8\x9b\xb7\xf6\x37\x9c\x3c\xd0\x0d\x27\xb9\xe0\x3a\x6e\xae\x15\xf7\x37\x35\x5c\x6e\x52\x34\xda\xf4\x7e\x93\x2d\xdc\x5e\xb2\xd7\x3d\x4c\x67\x94\x6e\xd0\xdb\xf0\x8b\x74\xbc\x0a\x46\x2b\x77\xe1\xeb\xd7\x40\x18\xf5\xa9\xd6\x96\x96\x5a\x52\xb3\x5d\x6d\xf1\xa8\xd9\x74\x7b\xd5\xa2\x26\xdc\xc7\x52\x1e\x5a\xc2\x6a\x3b\xf5\xa0\xda\xd5\x2a\x16\xee\x7a\x55\x7b\x4a\x18\xef\xd6\xad\x0a\x36\xfb\xaf\x4b\x9d\x96\xc5\xb3\xe7\x35\x83\xca\xaf\x78\x74\x34\x70\x5d\x3e\xb3\xaf\x45\xb0\x1f\xb8\xdb\xed\x01\xfe\xd6\x27\xf3\xf7\x55\x09\xdb\xaa\x4a\x30\xf5\xd1\xee\xeb\x10\xb6\x50\x0d\xeb\x71\x0a\xbc\x75\xf6\x1f\x4f\x40\x63\x3e\xbc\xa1\x18\xcb\xa8\x8c\x68\x9f\xe3\x96\x18\x6c\x77\xf4\x8d\xaa\x3b\x2c\x49\xc7\xef\xa6\xd8\x63\x8d\xaf\x47\xda\xd7\x87\x7c\x13\xf5\x21\x3b\xd9\xd9\x2c\x0f\xb2\x2f\x42\x59\xe7\x4e\x80\x7a\xc4\x5b\xea\xdf\x8d\xeb\x50\x5a\x97\xe0\x37\xa3\xff\x80\xa8\xef\x4b\x80\xf6\x25\x40\x3b\x2c\x01\xe2\xf9\x6a\xaf\x5a\x9f\x7d\xb1\xcf\xbe\xd8\x67\x17\xc5\x3e\x9b\x95\xfb\x7c\x85\x82\x1f\x4f\xfd\xb6\xfb\xaa\x9f\x87\xae\xfb\x59\xbf\xf0\x67\x9d\x48\xed\x2b\x56\xff\xac\xe5\x3d\x7c\xa5\x12\x20\xff\xa3\xad\xbb\x18\xdb\xc7\xcc\xee\xe6\x00\xcb\xee\xd9\xed\x71\x7e\x75\x6b\x35\x41\x5e\x94\xdc\xd7\x05\xed\xeb\x82\xf6\x75\x41\xfb\xba\xa0\x7d\x5d\xd0\xbe\x2e\x68\x5f\x17\xb4\xaf\x0b\xda\xd7\x05\x55\x8e\x2a\x39\xc8\xb3\xaf\x0b\xd2\x3f\xfb\xba\xa0\x7d\x5d\xd0\xbe\x2e\x68\x5f\x17\xb4\xaf\x0b\xda\xd7\x05\x7d\xb5\xba\xa0\x62\x93\xb4\xf5\x77\x63\xe8\x63\xe5\x27\xbf\x3e\xae\xf3\x65\x15\x75\x80\x76\x73\xb2\xad\x38\x9c\x68\x8c\x5d\x1c\x71\xab\x39\xab\xe8\x46\xb0\x0c\x8e\xbb\x48\x67\x84\x9f\xd8\x18\x9f\xc8\x6b\x87\xc9\xe9\xef\x73\x18\x55\xc0\x94\xb8\xe9\x67\x85\xf3\x11\x38\x90\xd6\x43\x78\x87\xb8\x49\x4a\xcd\xc9\xd4\x37\x11\xd8\x68\x6d\xb8\x73\x57\x8f\xcc\x5a\x4e\x9e\x9b\x57\x1b\x3a\x7b\xf5\xb8\x6e\xe0\xf4\xb5\x77\xf9\x9a\xc8\x66\x07\xbf\x96\xe3\xd7\x62\xa8\x96\x3b\x10\x6b\x3a\x81\xbe\xae\x46\x2b\x1a\x55\xe5\x61\x53\x87\xb0\x69\xf8\x6a\xc6\xbb\x6e\xe3\x6a\x8b\xce\xe1\x9a\x88\x95\x5c\x92\x4d\x8e\x70\x3c\x18\xff\x1e\x2b\xef\x1e\x07\xdf\x1a\x3c\x5d\x1f\x07\xab\x09\x27\x7f\x47\xab\x71\x76\x56\x2f\xb9\xaa\x7f\xda\x7e\xd7\xc2\x16\x72\x2d\xed\x18\xe3\x72\x16\x9d\x5e\x58\xbd\xc3\x56\xe6\xb1\xaa\x8e\x68\xf0\x30\xde\x59\x3d\x89\x46\xeb\xaf\x81\xaf\x77\x2f\x1c\xf0\x1b\x1c\x18\xdd\x6f\xd0\x26\x51\xf3\xbe\xe4\x56\xe8\x4e\x85\x1d\x85\x4d\x7c\x8a\xad\xe7\x8f\x6a\x31\x7d\xe0\x34\x52\x03\xd5\xb6\x9a\x4d\xf2\x1d\xeb\xb1\xec\xa6\xb4\xa1\xcd\x4e\xdc\x08\xd7\xc8\x0f\xbe\xb3\xd2\x1e\x9f\x07\xdc\x5f\xd9\x8c\x4d\x8f\x8c\x45\x5f\x99\x3d\x8e\x1d\x97\x16\x5e\x81\x0b\x89\xd6\x4e\x81\x73\x36\x8f\x2e\x09\xd3\x82\xfc\x2d\x73\x31\x65\x1b\x6f\xfb\xf2\xf9\x47\x70\x4b\x89\xcf\x7d\x1c\xa5\x0b\x26\xf6\x97\x6f\xec\x2f\xdf\xd8\x5f\xbe\xf1\xd8\x0a\xe0\x37\xbf\x7c\x43\x52\x8e\x3b\x8a\xe2\xbb\xf0\x1b\xaa\xd2\x6f\xc9\x8b\x75\xfd\x49\xdb\x37\xe2\xb7\xae\x2c\x6e\x59\x58\xac\x29\x63\x75\xab\x84\x05\x0f\x8f\x6b\x3d\x2c\xbd\x06\xa0\xef\xae\x37\xe6\x5a\x5b\x7c\xe5\xd8\x77\x50\x91\x67\xff\x9a\xff\xf2\xe8\xb6\x56\x0f\x50\x87\x67\x47\x6e\xdd\x12\x3c\xe9\x87\x58\x04\xbd\x14\xcc\x94\x7d\xae\x7a\x11\x6b\x2e\x58\xd1\x9c\x20\xdb\xe0\xed\x8a\x69\xf4\x6b\x54\x6c\xd8\x6c\x52\x3f\x63\x3f\x23\x3a\x76\x1d\x11\xb5\xad\xb7\xf2\x51\x4e\xa7\xe4\x30\x7b\xf3\xbb\xee\xd4\xb8\x8d\x4f\x8d\xdd\xd9\xdc\xde\x24\x38\x1a\x7e\x2b\x46\x87\xe3\xba\x45\xcb\x53\x9d\x7b\x61\x7e\x9a\x1c\x49\x1d\x84\x98\x88\xbf\x46\xcf\xa7\x59\x5d\xb1\x0c\x09\xcd\xa3\xb7\x48\xcf\xb8\x7e\x05\x1c\x59\x52\xc0\xca\x45\x67\xee\xb7\x21\x9d\xc6\x9d\x11\x0e\x8d\xdf\x55\x3e\xae\xd3\x39\xae\x12\xea\xf2\xa7\xab\x21\x38\x70\x8e\x35\xf8\xb9\xea\x34\x97\x79\x22\xf0\x96\x4f\xdd\xa0\x86\x96\x2b\xb7\xf4\xed\x63\xbe\x18\xc8\x45\x00\x13\x52\xb9\xf4\x40\xe7\x49\xd3\x3d\x5d\x24\x80\xc9\xf6\x6e\x03\xb9\x68\x07\x6d\x37\xd7\x81\x10\x5e\x2e\x58\xb1\xde\x17\xf9\xe3\x8a\xf1\xe6\x9f\x5a\x0b\x5e\x2e\x27\xf4\xff\x3e\x31\x20\xa2\x87\x71\x21\xb6\x9a\x3f\x5f\x71\x0f\xca\x98\xd4\xf8\x08\x7e\x07\xe5\xf5\x7d\xfe\x17\x49\xa8\xae\x51\x52\xae\x22\xf7\x21\xe7\x09\x4e\x13\xed\x51\xfd\x96\x7e\xf5\xa6\x24\xf3\x64\x03\x13\x0b\x88\x13\xf2\x21\x4d\x54\x31\x78\x6d\xc6\xd2\x81\x98\x5c\xf2\xa8\x7c\xbc\xdf\xef\x0a\x36\x0b\x61\xea\x22\x5b\x8b\xff\x2f\x24\x0a\x25\x41\xca\x4b\x4c\x14\x1e\x80\x30\xa0\xfc\x62\x08\x16\xd2\x32\x71\xcb\x15\xb3\x32\x19\xfd\x81\xe3\x6a\x13\x1e\x57\xc6\x73\x42\xc1\x2c\x4b\x17\x38\x44\x3c\xc2\x9c\x60\x14\x85\x84\x2d\x2c\x42\x31\x9d\x33\x8c\xf9\x73\xa1\xff\x61\x12\xf2\xbf\x24\xb9\xd8\xc8\x39\xa4\x29\xa5\x33\x32\x3e\x3e\x26\x14\x06\xb7\xe9\x02\x65\x93\x28\xfd\x32\x0a\xd2\xf8\xf8\xf7\x39\x22\xcc\xd4\x90\xe3\x3f\xfe\xf4\xe7\x3f\xfd\xe9\x3f\xff\xfc\xdf\xc7\x39\xbd\x8e\x66\xf0\x06\x27\x90\xbd\x3d\xfa\x82\xe9\x94\xff\x50\xd3\xe3\xb3\xbb\x45\xf7\x47\x69\x72\x04\x8f\x6e\xf8\xf5\x5b\x47\x24\xe7\xcf\x11\x47\x89\x0f\xaf\xd6\xd9\xa6\x15\x18\x65\x4b\x21\xaf\x7e\x11\xf1\x4d\xbd\x90\x38\x6a\x87\x96\xf5\xb7\x11\xd8\x22\x1b\xd1\xd1\xe9\x16\xfb\xf9\xa7\x65\x17\xb3\x61\xa7\xa2\x32\x90\x75\x77\x42\xf3\x45\x57\x76\x2f\xb0\x9a\x5f\xac\x99\x87\x6d\x49\x5d\x3a\xdb\x5f\xd5\x8c\xe8\xaa\xdd\xb2\xa6\xd2\xfc\x33\x69\x38\x49\x50\x56\x24\xd2\x80\xdd\x85\x64\xea\xdc\x9e\xbe\x50\x72\x39\x14\x66\x25\x35\x32\x6e\xac\x5f\x7d\xc2\x8d\x2b\x09\xaf\xdc\x59\xea\x93\x33\x53\xd3\x39\xb1\x68\x17\x0e\x99\xad\x76\x87\xfe\xb0\x26\xd7\xd8\x4f\x47\x32\x4d\x0e\x69\x64\x99\xaa\x17\x3e\xe9\xae\x8f\xd1\x70\xf4\x1b\xc4\x9c\x8a\x36\x4f\xa6\x32\x9d\x22\x03\x68\x45\x14\x68\x5f\xa3\x9e\xff\xc6\xe4\x6f\x90\x50\x7e\x97\x27\x3f\xe5\x95\x33\xe0\xe0\x00\x60\xe6\x84\x1a\x19\x3e\x85\x2a\x99\xa6\xf3\x28\x64\x4c\xc6\xc9\x9c\x27\x30\xcc\x84\x9f\x06\x75\xf0\x33\x78\x52\x6a\xde\x90\x34\x13\xbf\xbf\xbb\x5c\x60\xf1\x53\xcf\x07\x02\xb0\x1a\xe4\x8e\x83\xe4\xa3\xcd\x5b\xcd\x5f\x9a\xde\x2a\xe3\xb7\xe1\x91\x5a\x9c\x53\x9a\xc1\x84\xc0\x80\x5b\x9e\xd3\x84\x39\x45\xa1\xae\xf2\x64\x27\xa9\xe1\xf3\xc6\x6c\x09\x0b\x85\xce\x97\x96\x79\x13\xa4\x80\xf2\x49\x83\xab\x92\x5b\x7a\xff\x5f\xd4\xca\x1c\x9f\xe8\xb1\x86\x63\x8c\x66\xcf\x38\xef\x78\x01\x17\x95\xa5\xff\x22\x09\xd9\x23\xfb\xf8\x2e\x2f\x39\x7e\xe6\x8a\x45\xd8\x3b\x15\xa1\x13\x70\x88\x54\x90\x3e\x52\x8f\x5f\xce\x71\x14\xa2\x6c\x08\xe2\xe7\x3a\x18\x17\x0a\xac\x9d\x27\x48\xdd\x77\x0e\x21\x85\xcf\x94\xde\xe3\xbe\x4f\x35\x2c\x8a\x9f\x0d\xba\x76\x6d\xa7\x09\x8a\x8c\xcd\xc4\xc4\x4e\xef\x66\x0c\xf3\x67\xec\xf7\x3f\x60\x44\xf2\xff\xf3\x9c\x96\x1a\xee\x9a\xe1\x93\x37\xef\xeb\x24\xf1\x1f\x8f\x4d\xe0\xb9\x65\x02\x4e\x56\xc5\xcf\x5b\x4c\xe6\xb9\x36\x99\xe7\xda\x64\x9e\x37\x4e\xe6\x79\xfb\xc9\x74\x70\x35\x88\xc9\x97\xc1\x6f\x19\x16\x77\xdb\x12\x75\xb9\x6d\xfe\x8a\x3f\x1d\x83\x4b\xcd\xed\xaa\xf4\xe2\x39\x0b\x91\xb8\x38\x9f\x53\xdd\xb7\x39\xcf\xe3\x23\xf1\xf1\xba\x1f\x97\x7d\x18\x54\x19\xbf\x08\x19\x12\x8f\xad\x79\x27\xf1\xd1\x24\x43\xb4\xad\xcb\x35\x16\x92\xe3\x6c\x2b\xf3\xa3\x86\x64\xf1\xc6\xfc\xea\x61\xf9\xb3\x7e\xce\x1d\xd7\x85\xc0\xa5\x8d\x4b\x72\x54\x27\x52\x22\x43\x73\x9e\xa1\x09\xbe\x1b\x38\xe8\xf3\xdc\x83\x3e\xcf\x5b\xd0\xe7\x79\x0b\xfa\x3c\x77\xd3\x87\xfd\x58\x01\xd0\x05\xc0\x71\xf3\x72\x55\xfe\x2a\xee\x97\xfc\xee\x88\x5a\xb3\xa1\xac\xc6\xf1\xb1\x43\xc9\xc8\xc7\x04\xc0\x8a\x7e\x06\x90\x3d\xcd\xb1\x62\x81\x06\xb3\xc7\x2a\x08\x04\x0b\x4e\x94\x91\xd0\xef\x2e\x15\xe6\x52\xc5\x03\xd0\xf7\x88\x5c\xb4\xed\x82\xd2\xe9\x29\x23\xe2\x95\x31\xac\xa4\x43\xdb\x1b\xc3\xf3\xab\x0a\xcd\xa7\x63\x10\x0f\x85\x19\x37\xbd\xfe\x05\x8c\xd6\xbe\x9b\xbc\x69\xa4\x5a\x7d\x55\xca\x6c\x29\x87\x29\x86\xb7\x08\x90\x79\x86\x8a\xf3\x5a\x05\x93\x88\xf4\x8f\x02\x91\x2b\x00\x04\xcd\x60\x06\x69\x9a\x81\x60\x0a\x33\x18\x50\x94\x11\x63\x57\xff\x07\x42\xb3\xf3\x2c\x9d\xa1\x8c\x62\x44\xce\x8a\xcc\x02\x29\x4e\xcb\x39\xde\x9b\xee\x87\x0e\x54\xbb\x81\x9d\xa0\x19\x07\x94\x66\x14\x85\xef\xd1\x3d\xa9\x1b\xd1\x0e\x46\x4d\x93\xf5\xd2\xb6\xe6\xdc\x70\xf8\xa8\x79\x2a\x52\x9e\xf8\x1b\xe5\xe9\x93\xfe\x72\x59\xd0\xeb\x53\xca\x35\x4c\xf5\x7e\x1f\x73\xd0\x5e\x3c\xea\x71\xe3\xcf\xe3\x39\x01\xbd\x37\xb0\xf0\x4b\x8f\x44\xf2\xec\x5c\x01\xa6\xb8\xcd\x32\xe7\xcf\x8f\x05\xbc\x1f\xf3\x64\xc7\xfa\xf8\x0d\x0c\x59\x69\x3a\xbc\x79\x7c\x0c\x60\x18\x02\x9c\x58\x05\xa9\x7c\xac\xcd\x48\x41\x35\xe4\x9f\x9a\xcb\x6e\x66\xea\xd6\xfe\xad\x5c\xfc\x6f\x11\x3c\xcf\xab\xff\xe5\x02\xfd\xea\x97\xff\xc7\x95\xdb\xff\x9b\x65\xc0\x02\x65\xd4\x33\xbf\x1b\x00\x94\x3e\x86\x00\xb4\xd4\x40\x2c\x34\xbe\x1d\x82\x45\x11\x1d\x17\x5c\x94\x1d\x17\x30\xba\xbc\xbd\x02\x27\x60\xe1\x23\x89\x9b\x5c\x52\xbf\x81\x74\x5a\xd3\xac\xda\x76\x41\x39\x2f\xbc\xb6\x84\xbe\xbd\x38\x33\x45\xab\x0c\xd9\x2a\xb8\x44\x08\xae\x05\xcb\xb2\xa4\x92\xf6\x92\x6a\xe9\x52\x2f\xa9\x95\x0e\x6b\x49\xaa\x05\xca\xc3\x4a\x6a\x2d\x83\xd7\x12\x5e\xf5\x48\xa2\x90\xfb\x09\xba\x43\x26\x1c\x31\x7b\x96\x4b\xc4\xc1\x11\xa4\x76\x5f\x8c\xd0\x34\x43\x5c\x39\x2b\x87\x8c\xa6\xf6\x86\xd9\x3c\xa0\xd2\x2b\x73\xec\xb7\xc5\x3e\x59\xe3\x21\xe0\x09\x3d\xa7\xff\x56\x04\xb3\x0b\x98\x01\x8b\xb8\xdb\x9e\x99\xbb\x81\x95\xf5\xf3\xf7\x24\x2e\x56\x50\x3c\x04\x07\x16\x10\x35\x9b\x7f\x05\xc7\x0f\x19\xee\x27\x36\x0c\x6c\x1b\x94\x86\xea\x90\x15\x91\xe9\xbf\x50\x90\x6f\xa3\xe5\xc9\xcf\xb2\x1a\x21\xca\x70\xce\x60\x46\x1c\x0e\xd8\x24\x4b\x63\xa0\xe0\x01\x95\xe1\x17\x3a\x8a\x71\x3b\x09\xc1\x04\x47\x91\x80\x84\x13\xe1\x32\xb3\x2e\xd2\x97\xb1\x29\x49\x13\x41\x17\x7a\x22\xaf\xdf\x62\x2a\x95\x71\x6e\x6d\x40\x3c\x41\xac\xb5\x33\x20\xdd\xd0\x00\xf2\xf4\x23\x4e\xc2\x06\xed\x5d\x07\x09\x4f\xc0\x22\x3f\x6d\x10\xd7\xe4\xde\xf9\xb9\x83\x83\x03\xb0\x18\x5d\x98\x72\x35\x83\x19\xd5\x1c\x5f\x32\xba\x98\x45\x98\xf6\x0f\x17\xa3\x0b\xe9\xfb\x05\x70\x74\xa1\x7c\x6a\x75\xc3\x96\x3c\x00\xc0\xbb\x0f\x18\xc8\xe5\x52\xc8\x55\x00\x47\x85\x8f\x5a\xa8\x1a\xfb\xbe\xd8\xdd\x4c\x88\x8c\xb3\x33\x87\x3f\x06\x3f\x3e\x7d\x4a\x7e\xec\x0d\x01\x43\x6b\xa0\x25\x24\xcb\xea\x53\xb2\x14\x0f\x39\x3f\xb9\xeb\x5c\x81\xc9\x3b\xa6\x95\x0b\xe8\x66\xd2\x5d\x65\x33\xf1\x39\x43\xcd\x5b\x1f\xc8\xb3\xd2\x1c\xcd\x4b\x46\x2d\x0c\x56\xab\xab\x06\xd5\xee\xad\x68\x5b\xa9\x63\xf9\x55\x38\x4e\xf5\x4b\x4c\xfd\x1b\x61\xc2\xb3\xcf\xd5\x66\x2e\x45\x4c\x22\x1c\x20\x5b\x17\xa9\x91\x49\xad\x4a\x26\xfd\x98\x80\xcb\x2b\x0f\xb5\x3c\x00\xfd\xcb\x2b\x9f\xd3\x75\xce\x23\x0f\xa2\xec\x1c\xde\xa2\x3a\x40\x4c\x7c\x63\xc2\x77\x47\xf8\x16\xc8\x10\xc4\x85\xf5\x54\x5b\x20\xeb\x9e\x08\xf1\x38\x13\x12\xb7\x3d\x00\x62\x33\xfe\xc5\xb7\x02\xb8\x68\x71\x89\xaf\xb8\x50\x3b\xde\x9b\x89\x79\x37\x98\xfc\x18\xc9\xff\x07\x00\x00\xff\xff\x9a\x71\xe2\xe0\x79\xd9\x00\x00") +var _tableGoTmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x3d\x6b\x73\xdb\x38\x92\x9f\xa5\x5f\x81\xe8\x26\x1e\xc9\x2b\xcb\x93\xdc\xd6\xdd\xae\x66\xbd\x55\x79\x38\x89\x2b\x3b\x19\x5f\x9c\xdd\xb9\x2a\x97\x2b\x0b\x93\x90\x85\x35\x1f\x1a\x02\x52\xec\xd3\xea\xbf\x5f\xe1\x41\x10\x20\x01\x12\xd4\xc3\x71\x52\x52\x55\xec\x98\x04\x1a\x8d\x46\xa3\x5f\xe8\x86\x96\xcb\x23\xf0\x43\x9c\x86\x28\xfa\x00\x63\x04\xc6\x27\x60\x06\x49\x00\x23\xfc\x7f\x08\x8c\xfe\xf7\xf5\xcb\x57\x69\x32\xc1\x37\xa3\x8b\x60\x8a\x62\xc8\x9b\xac\x56\x5d\xde\xe9\x2e\xbc\x16\x2f\x59\xa7\xa2\xa9\x7a\x1f\xa1\xe4\x55\x1a\xcf\x52\x82\x29\x7a\x41\x69\x46\x58\xbb\x08\x25\x5a\xcf\x91\xd1\x00\x5f\xcf\x29\x22\xaa\xff\x14\x92\x6a\xff\x1b\x6a\x03\xfc\x93\xea\x34\xcb\xd2\x7f\xa1\x80\xa2\xf0\x2c\x09\xd1\x1d\x22\xbf\x61\x3a\xb5\x0d\xc2\xe6\xe9\xd9\x54\x9b\xa8\x36\xb5\x73\xff\x81\xf8\x9c\x7d\x47\xd3\x66\xdf\x62\x08\x49\x16\xdf\x1e\x05\xbd\x08\xcd\x70\x72\x73\x9e\xa5\x33\x94\x51\x8c\xc8\x59\x41\x5a\x0e\xb8\xf6\xbd\x9d\x32\x17\x0d\x20\x39\x39\x6a\xe1\x6a\x34\x68\x02\x26\x27\x5e\xdb\x8c\xcf\x76\x06\x83\x5b\x78\x83\x40\x78\x9f\xc0\x38\x0d\xaf\xbb\x5d\x1c\xcf\xd2\x8c\x82\x7e\x17\x80\x5e\x90\x26\x14\xdd\xd1\x1e\xfb\xff\x24\xe6\xbf\xc5\x87\xe1\x81\x27\x20\xcd\x5a\xad\x48\x23\xe6\xab\x95\x1a\xa1\x27\x48\x41\xcc\x31\x51\x12\xb2\x46\x0c\x9f\xe5\x12\x8c\x7e\x49\xc3\x79\x84\xe4\xf6\x5b\x2e\x47\x6f\xd3\x5f\xe7\x74\x36\xa7\xe7\x90\x4e\x57\xab\x63\xbe\x7f\xc9\x72\x39\xfa\x07\xca\x08\x4e\x93\x8b\xf9\x64\x82\xef\x56\xab\x5e\xde\xff\x5c\xcc\x5e\x02\x38\x66\x8f\x0a\x00\x40\x36\xbc\xc1\x74\x3a\xbf\x1e\x05\x69\x7c\x0c\xbf\x10\xf6\xef\x88\x84\xb7\x47\x37\x29\xfb\x6f\x85\x24\x49\x4a\xf5\x9d\xfc\x22\x8a\xd2\x2f\xbf\x2e\x50\xf6\x25\x2b\x66\x58\x0f\x92\xfd\x43\x59\x66\x9d\x78\x6d\x5f\x82\xb2\x05\x0e\xd0\x71\xbe\x96\x0d\xd8\x97\x9b\xab\xff\xc0\x7c\xc5\xd6\x05\x80\x27\x30\xe0\x9d\x25\x4d\x68\x06\x13\x02\x03\x8a\xd3\x84\x9c\x26\xf0\x3a\x42\x61\x69\x93\xb4\x1b\x07\xdd\xcd\x32\x44\xd8\x8a\xe6\x83\x58\xc9\x73\x93\x1e\xa5\x33\x94\xc0\x19\x3e\x26\x34\xe3\xfc\x3b\xe8\x76\x17\x30\x03\x9f\x01\xdf\xc2\x93\x98\x8e\x5e\x43\x8a\x3e\xe1\x18\x2d\x57\xdd\xee\xf1\x31\x58\x2e\x75\xb1\xbf\x5a\x7d\x62\xd8\x82\x0c\xb1\x01\x51\x42\x09\xa0\x53\x04\xe6\x04\x65\x47\x01\x47\x7e\x9e\xf1\x06\x33\xc5\xcf\x20\x9d\xf0\x36\x65\x40\x80\xb2\x86\xa3\x2e\xbd\x9f\x55\x5f\x8a\x51\x08\xcd\xe6\x01\x05\xcb\x2e\x00\xaf\xf9\x54\x5f\xbf\x7c\x71\x7e\x96\x73\x81\x41\xdc\x91\xd6\xa0\x0b\xc0\x79\x86\x26\xf8\x0e\xe8\x1f\xb1\x7d\xba\x00\x70\xd8\x7c\x9c\xea\xbb\x8f\x08\x86\xaf\xe0\x0c\x06\x98\xde\xff\x3d\xc1\x94\x00\x80\x13\xfa\x5f\x7f\xec\x02\xf0\x1b\xe3\x57\xf3\x9d\x78\x25\xe8\x14\x86\xd7\xe5\x49\x9c\x67\x38\x86\xd9\xfd\x7b\x74\x5f\xa6\xd7\x4c\xbc\x01\xb7\xe8\x9e\x91\x07\x56\x89\x83\x13\x35\x65\x49\xa2\xfa\x01\x34\x52\xb1\xe5\x3f\x3e\x04\x51\x9a\xce\x40\xba\x40\x99\x31\x1a\x2c\x84\x0f\x4c\x42\x00\xc3\x90\x21\x14\x03\x48\xc0\x04\xa3\x28\x64\x93\xe2\x28\x4a\x80\x87\xc7\x9c\x8b\x18\xcc\x0c\x26\x37\x08\xfc\xf0\x79\x08\x7e\x98\xdd\x32\x99\xaa\xed\x6a\x85\xeb\x7b\x74\x2f\x4c\x00\x20\xfb\x69\x66\xc2\x0f\xb3\xdb\x91\x12\x7e\xf9\x44\x97\x4b\x70\x93\x7e\xba\x9f\xa1\x37\x69\xa6\x5e\xea\x9b\xc1\xda\xeb\x9f\x6a\x6b\x2e\xc6\x4c\x70\xd9\x1a\xf5\xfe\x69\xee\x85\x55\xb7\xbb\x5c\xe6\xb3\xb8\x21\xd8\x35\x85\xb7\x51\x7a\x0d\xa3\x0b\x14\xa4\x49\x08\xb3\x7b\x29\xc2\x19\x84\x7c\x99\x8b\x45\x58\xad\xde\x5e\x9c\x99\x93\xbc\x21\x78\xc4\xfb\xe4\xb8\x96\xd6\x9e\x61\x5b\x69\xf3\xf6\xe2\x4c\x5f\xe6\x76\x03\x18\x6b\x9f\x4f\xf0\x96\xab\x3d\xde\xb8\xb2\x26\x47\x3a\xb8\x5b\xb2\xce\xa2\xd8\x7a\x55\x16\xc5\xd2\x88\x2f\x4a\x2e\xc5\x8b\x95\x29\xfe\xef\xd8\x4b\x3a\x15\x2d\xdb\x05\x12\x40\x68\x9a\xa1\xd0\x6f\xe3\xe8\x24\x13\x3a\x71\x54\x6e\xc2\xd8\x65\x32\x4f\x02\xd0\xa7\x76\xe9\x34\x00\x41\x86\x20\x45\xfd\x80\xde\x01\x69\x17\x8c\x5e\x89\xdf\x03\x80\xb2\x2c\xcd\x38\x7c\x3c\x01\x9f\x87\xec\x6f\xb6\x1e\x54\x97\x53\xa3\x57\x1c\x00\x87\x26\x2c\x04\xde\x99\x01\x1c\x82\x83\x9c\x98\x7a\xab\xb3\x64\x36\xa7\x4b\x4e\x41\x45\xd8\xd7\x68\x82\x13\xcc\x55\xc9\x18\x5c\x5e\x1d\xaa\x7e\x96\x16\xcb\x2e\x70\x7c\xb8\x1d\x05\x73\xeb\x19\xea\xab\x46\x6c\xbb\x44\xb7\x4c\x6c\xb0\x24\x17\x32\x40\x9c\x0f\x05\x68\xd5\xa9\x40\xc4\x60\x90\x31\x80\x5f\xc8\x48\x58\x44\xfd\x9e\xc2\x89\xf1\xcd\x60\x58\xed\xc2\x38\xb4\xdc\x45\xaa\x85\xd7\x2f\x6b\xd9\xb7\x02\x75\x35\xac\x9d\x8e\x52\xa7\xaa\xa5\xda\x54\x26\xd1\xd5\xe3\xd3\x08\xc5\x28\xa1\xf5\x14\xd7\x44\xaa\xdc\xaf\xcd\x22\xb5\x1d\xf9\x6c\x5b\x70\xe0\x9e\xab\x8e\x1c\x9e\x00\xf4\x3b\x87\xf0\x1e\xdd\x33\x6a\x82\xde\xbb\x17\x17\xef\x7a\xfa\xd2\xcb\x37\x63\xf9\xa7\x36\xbc\x4e\x11\xd6\xe4\x1d\x24\x53\xcf\x81\x51\x44\x90\x6d\xf4\x8f\x2f\x3e\xbc\x3d\x5d\x73\xf8\x8f\x8c\xd2\xbe\xe3\x17\x8b\xbd\x06\x63\x94\x5b\x30\xb7\xe3\xed\xc5\x99\xcd\xab\xf5\x50\x39\x8e\x85\x91\xee\x0c\x87\xfb\x53\xde\xce\x0e\xc5\xe4\x4f\x5b\x1b\x2f\x1e\x5d\x4b\x61\x4a\x28\x0a\xbe\x52\x5b\x95\x5d\x5b\xd1\x6a\x3a\x97\x4a\x77\x0a\xa7\xc9\x58\x93\x8b\xc5\x53\x7d\x02\xc5\x53\xab\x74\xe0\xe3\x14\x6d\x46\x66\xf3\xd2\xb8\xda\x8a\x6e\xbc\xdd\x6b\x48\xab\x6d\x7f\x8b\xba\x56\x1d\xbc\x41\xef\x4c\x2a\x98\xd8\xfb\xc8\x07\xb0\x0b\x19\x61\xa2\xe1\x2f\x2d\xda\x21\xe3\x2b\x31\x4a\xd8\xe8\xb2\x03\xd4\xcb\x0f\x8f\xfe\x2b\x63\x13\x2c\x30\x73\xf1\x50\xf8\x69\x9a\xa5\xf3\x9b\xe9\x6c\x4e\x4b\xfb\xa1\xda\x40\xe7\x9a\x8a\x73\x33\x16\x04\x38\x63\x6e\x4c\x9f\x8e\x2a\xef\x8d\xd9\x57\xfd\x9f\xb1\xd1\xbb\xfa\xde\xb6\x93\x36\x16\xa7\x5a\x8b\xcd\x28\xb2\x3e\x35\xd6\xa6\x84\x9c\x92\x72\x40\x8d\x9d\x49\x47\xea\x39\x6f\xbe\x1a\xfc\xcc\xad\xc6\x27\x27\x20\xc1\x91\xdc\xfe\x19\xa2\xf3\x2c\x01\xcc\x4f\x3f\x65\x16\xe6\xa4\xdf\x9b\x40\x1c\xa1\x10\xd0\x54\xda\xa3\xc2\xaf\x06\x4f\x9f\x92\x31\x78\xfa\xf4\x4b\x6f\x08\x34\xc8\xdc\x10\x1d\x30\xe8\x5d\x05\x2c\xc1\x91\x87\xb1\x4b\xe0\x02\x95\x5f\xd9\x4c\xdf\x21\x88\x5d\x26\xb5\x6e\x15\x87\x90\x42\x65\x15\xa3\x24\x48\xc3\x2a\xf4\x78\x20\xcc\x67\x17\x15\x50\x96\xc9\x99\x14\xec\x81\x27\x8d\xc1\x26\x69\x8d\x97\x8d\xf1\xf3\x39\x3d\xa3\x28\xae\x31\xc4\x65\x0b\xcd\x08\xf7\x5b\x49\x00\x58\x37\x29\x72\xf8\xc4\xf9\xf2\x76\x4b\x13\xd1\x78\x9c\x89\xb4\x47\x84\x2b\x00\xa7\x2a\xc0\x64\xe8\x0d\x32\x06\x31\x9c\x5d\x8a\xf0\xc9\xd5\xa1\xf8\x9d\x6f\xb0\x75\x63\x06\xec\xd3\xfb\x8f\xe5\x12\xcc\x67\x33\x94\xd9\x5d\xfb\xaa\x5e\xb7\xb5\x52\x3b\xd6\x2e\x5a\x5e\xa5\x49\xc8\xdd\xa2\x62\x76\x26\x5c\x8b\xa8\xd2\x26\x85\x3d\x27\x75\x64\x75\x95\xf2\xe8\x28\x03\xc4\x4d\x38\xf0\xe2\xc3\xeb\xdc\x27\xb6\x77\x51\x5e\xd9\xe7\x24\xa5\x9f\xd1\x1d\x26\x94\xf4\xeb\x09\x35\x70\x8c\xec\x1e\x44\xd2\x7f\x30\xec\x76\x56\x83\x6e\xa7\xbc\xfd\x3a\xec\x09\x44\x59\x36\x04\x29\x9f\x3b\xca\xb2\x51\x5f\x04\x68\x85\x48\x1a\xfc\xcc\xde\xb0\x96\x1d\xf2\x05\xd3\x60\xca\x9b\x8f\x5e\xa5\x21\xea\x0f\xc4\xf3\x4e\x00\x49\x11\x61\x67\xdd\xd8\x5b\xb5\x1c\x30\x7a\x35\x45\xc1\xed\x1b\x2e\xd8\x4e\xef\x02\x34\xe3\xa6\x1f\xef\xd9\x91\x5b\x46\x74\x2b\x8b\x8c\x17\x51\x86\x60\x78\x7f\xca\x49\x23\x86\xea\x74\xd6\xe3\xc3\xbc\x6f\x43\xfc\x6a\xcc\x96\x0c\x4f\x00\x2e\xce\xa0\x9a\x82\x57\xcb\x25\x08\xf2\xb6\xff\x80\xd1\xbc\xa1\x43\x2f\xee\x89\x4e\x52\x2a\x2c\x97\x05\x23\x7c\x4a\x7f\x61\xb3\xf7\x82\x32\xca\xc1\xf0\x7d\x30\xd4\x88\x23\x77\x06\xff\x7b\xe5\x5e\x9f\x8f\x88\xa4\xf3\x2c\x40\x1f\x52\xfa\x26\x9d\x27\xae\x95\xd1\x75\x93\x50\x45\x69\x06\x30\xb3\xec\xf9\x51\xc0\x84\x75\x65\x9a\x89\x98\x9a\x69\xd0\x95\xa3\xb3\x7f\x9a\x5c\x64\x7f\x6b\x8a\xaa\xcc\xc4\x79\x5c\xcf\x2a\xf9\x5f\x42\x1a\x4c\x7f\x53\xa2\xdf\x43\xc3\xbd\xc8\x32\x78\xff\xeb\xc4\x53\xd1\x11\x70\x79\xd5\xa8\xeb\xd8\x86\x89\x50\xd2\x8f\xc9\x00\xfc\x15\xc4\xf0\x2e\xe7\x37\x8e\x1d\x93\xb6\x84\xef\x0a\x0b\xf9\x6a\x30\x02\x19\x0a\x10\x5e\xa0\x10\x3c\x7d\x1a\x02\xcc\xa1\xd0\x94\xcf\x61\x08\xbe\x4c\x71\x30\x05\x98\x80\x1b\x6e\x11\x64\x80\x4e\xa1\x88\xea\xc6\xf0\x0e\xc7\xf3\x18\xa4\x13\xd6\xaf\x37\xcc\x31\x1b\xda\x11\x1b\x30\xf2\x1b\x33\x38\x39\x01\x3f\xe9\xe8\xb2\x35\xe1\x6d\xae\x59\x27\xb6\xb3\x62\x78\x8b\xfa\xba\x8f\xc4\x17\xe0\x23\xfa\x7d\x8e\x08\x55\x03\x0e\xba\x9d\x09\xe3\x0b\xd6\x43\x6c\x4e\x41\x06\x2f\xbb\x80\x5c\xe2\xab\x81\x10\x45\x25\xe1\x64\x70\x0e\x67\x25\x8e\xd7\x25\xbe\x02\x27\x9a\x76\xd4\x51\xe2\xdd\xce\xe7\x54\xfe\x39\x36\x95\xa8\xde\xa8\x23\x54\xa3\xd0\x8a\x8c\x5b\x87\x62\x8c\x55\xb7\x43\x13\x79\x28\xae\x71\xb4\x98\xa1\x14\x99\xe9\x9c\x3a\x82\x80\x05\x93\x36\xa8\x74\xb3\xa1\xd4\xec\x9d\x4e\x47\xa2\xc8\x17\xcc\xd0\xc7\xae\x45\x10\x93\xe1\x28\x8f\x01\xa7\x8f\x36\x9d\xb2\xd5\x69\xdf\xd8\x26\x2e\x6c\x3b\x2f\x7a\xd2\xb6\xec\x74\x56\xca\x27\x4b\xe7\x74\xf4\xf7\x64\x96\xa5\x01\x22\x04\x85\x82\xd9\x25\xe8\x83\x03\xce\x0b\xb6\x26\x97\x1c\xb7\x2b\xb6\x5f\x04\xb3\x49\xee\x3a\xb1\x02\x94\xad\x8b\x81\x45\x8f\x0c\xc1\x5b\xb5\x3e\xad\x4c\xdd\x10\x45\x88\x3e\x32\x51\x50\x8b\x93\x43\x18\x88\x3e\xdb\x16\x07\x00\x3c\xa8\x40\xe8\xdc\xa2\x7b\xb5\x73\x2a\x07\xb2\xa3\x5f\x60\x46\xa6\x30\xfa\x05\xce\xfa\xb5\x07\x64\x0c\xd2\xda\x86\xc0\x83\x58\x01\x6f\xb2\x34\xe6\xeb\xdb\xa4\xc8\x99\xf4\xeb\x95\x2c\x02\x66\x94\xe5\xcd\xce\xc8\x79\x8a\x13\xb6\xce\x0d\x28\x1c\x2a\x6b\x80\xc3\x1c\x35\x4e\xd3\xb0\x1e\x0c\xcb\x61\xe5\x27\x8e\xbd\xe5\xf1\x6b\xce\xba\x16\x91\x6c\xbc\x10\x82\xec\x3d\xba\x1f\x03\xc6\x25\x7b\x99\xfc\xed\xca\x64\x3d\x97\x45\xb8\x73\xdc\xb2\x35\xbd\x4d\x2e\x4d\xaa\x8f\xdf\xa4\x19\x8f\x1c\x1b\xfc\xde\xb4\xad\x1b\x74\xc0\x0d\xa2\x5e\x92\xbf\x7a\x36\x6e\x9c\x9d\x71\x09\x63\x9f\x8b\x3a\x8b\x5d\xc0\x8c\x73\x6a\xa9\xa7\xd7\x31\x6c\xb9\xcb\xb0\x6b\xfa\x77\x03\xd0\x3f\x74\xa8\xa5\xa1\x50\x4b\xdc\x25\xfb\xfa\x32\xf6\x31\x38\x5a\x15\x3f\x4b\xad\x4c\x1b\x59\x68\xf7\x9a\x0b\x66\x1f\x6a\x6e\x0d\x71\xc8\x9f\xb7\xa8\x29\xbe\x23\x5b\x28\x89\xc3\x85\xa0\xf8\x48\x51\xe8\x13\xef\xe9\x74\x5e\xa5\x09\xc1\x84\xa2\x84\x7e\x44\x30\x14\x4d\x5f\xa6\x69\xd4\xa7\xd9\x1c\xe5\x41\x00\xaf\xc0\x9a\xe7\xa4\xf5\xf8\xd6\x43\x46\x17\x3c\xbd\x57\x8e\xeb\x16\x5d\xd8\xea\xdc\x55\xc2\x9e\x34\xa2\x32\x44\x46\x6c\x29\x95\x29\xa5\x45\x38\x79\x6f\x7b\xa8\x23\x9f\x87\x68\xbf\x89\x0c\x2a\x67\xe9\x94\x65\x0a\xdf\x79\x4e\x21\x35\xec\xda\x02\x6c\x3c\x2e\xdb\x05\xac\x9b\x3b\x1e\x5c\x44\x77\x99\xd8\x41\x56\x5f\x2f\xa7\xce\x10\x1c\xc4\x35\x01\x71\x45\x66\x39\xae\x7c\x7c\x10\x0f\x73\x9b\x5f\x48\x8f\x32\x0b\x4b\xe1\xc5\xd5\xc7\x45\x00\x13\x9f\x30\x41\x00\x93\xf2\x2b\x62\xf7\x0a\x30\xdb\x9d\x6c\xfd\x2e\x6c\x7d\xf8\xde\x1d\x82\x49\x02\xd8\x88\xfd\x18\xb8\x25\x75\x04\x49\x45\x1d\x81\xeb\x34\x8d\x06\xf2\x67\x11\x58\x67\xe8\x71\xc8\x8c\xa8\x85\xbc\xb8\xc8\x1f\x57\x82\xc1\x22\xb4\x58\x17\x11\x76\xca\x88\x27\x7c\x82\xa3\xd7\x98\xb0\x1e\x66\x33\xd9\xf7\x6f\x38\xc6\x74\x5c\x04\x16\x45\x0f\xfe\x74\x28\x83\xf7\x4c\xa8\xf3\xa7\x17\x14\x66\x14\x27\x37\x2f\x26\xcc\x78\xd5\x96\x59\xca\x1f\xbe\x03\x19\x71\x21\x4e\xc8\x87\x34\xa9\x66\xd4\xb6\xb2\x00\x18\x3a\xe8\x2e\x88\xe6\x04\x2f\x10\x1f\xfb\xbd\xaf\x1a\xb4\xe0\x2b\x22\xad\xb6\xd3\x0a\xeb\xa9\x8d\x58\x30\x1e\xe0\xc0\xc9\x4d\x81\x07\x20\x0c\x28\x4f\xd5\x63\x96\x2a\x5b\xcd\x5c\xd2\x28\x19\xd8\x1f\x0c\xd4\x2e\x2b\x6d\xbc\xe3\x63\x10\xcf\x09\x05\xb3\x2c\x5d\xe0\x10\x81\x34\x89\xee\xb9\xa7\x27\x93\xfb\x82\x34\x21\x14\xd3\x39\x43\x9b\x3f\xe7\x34\xe5\x5d\x15\xe3\x8c\x4e\xcb\x44\x01\x27\x46\x98\xbf\x9a\x61\xc4\xb5\xab\xed\x80\x5a\x93\x4b\xad\x12\x5c\xac\xb1\x72\x97\xea\xb7\x9c\x66\xe7\xc7\x08\xae\x2c\x34\xdd\xa5\x70\xcf\xe2\xc2\x50\x9d\xcb\xa5\x69\x4d\x9c\xc3\x9b\x06\x3c\x7a\x16\x3e\xe9\xad\x56\x4d\x49\x47\xe6\x11\x50\xc3\x3c\x6c\x4c\x7c\xe9\x6c\x7f\x55\x33\x62\xf9\xe4\xda\xf1\x72\x25\xb7\x2d\x4d\x29\x8c\x3e\xa2\x20\xcd\x42\x72\x9e\x1b\xff\x6c\x89\x79\x56\x6c\xff\xa7\x81\x14\xff\x38\x49\x50\x76\x9a\x65\x42\x46\x75\x81\xdd\xe2\x61\xf2\x89\x11\x94\x54\x6c\x1e\xc5\x97\x43\x21\x27\xd3\x39\x05\x87\x86\x5c\x13\x19\xea\x42\x4a\xf2\x45\x29\x24\xa3\xdc\x82\x3c\x24\x32\xac\x57\x35\x84\xbb\x3d\x32\xce\xe1\xde\xcb\x6a\x3a\x27\x96\xfd\xcc\x21\xb3\xad\xe5\xd8\xb1\x85\x28\x80\x11\x41\x8a\x9c\x00\x94\x42\x1f\x58\x86\x82\xe4\x90\x13\x5d\x6c\xa2\x0a\x4a\xba\x1a\x35\x1a\x8e\x7e\x83\x98\x53\xd1\xa6\x39\x2b\xd3\xd1\x4f\x21\x2d\x88\x16\xc8\x16\xbf\x31\xf9\x1b\x24\x94\x5b\x16\x3c\xbd\x29\x5f\x80\x83\x03\x80\x99\x39\xc3\xec\x1b\x3e\x97\xc1\xd1\xb3\x62\x32\x64\x9a\xce\xa3\x90\x2d\x32\x4e\xe6\xdc\x3c\x99\x24\xfd\x03\xde\xee\x12\x5f\x0d\x75\xa8\x83\x9f\xc1\x93\x52\xf3\x02\x7b\x0b\x8a\x39\x62\x56\xe6\xfc\xc3\x1f\xe4\xdb\xe3\x63\x9e\x84\x3f\x45\x42\x3d\x81\x74\x02\x32\xd1\x16\x4c\xe1\x02\x81\x6b\x84\x12\x66\x11\x11\x71\xae\x3e\x49\x86\x20\x4c\x93\x1f\x29\x7f\x06\x60\x72\x1f\xa7\x19\xca\xbb\x8c\xac\xab\xa4\x79\xd4\xf6\x8d\x72\x72\x02\x0e\xf5\xf6\x1e\xd3\x5a\xe9\x16\x0f\xb3\xcf\xf3\x63\x64\x3e\xb4\x5c\x47\x9b\x75\x94\xbf\x34\xcf\xfd\xd9\x7a\x57\x1c\xef\x5c\xcd\xbe\x83\x84\x27\xc0\x30\xe9\xdf\x28\xb3\x79\x4e\x11\x13\x8e\xf3\xbc\xe4\x25\xb7\x3b\xb1\xfa\xc3\x0f\xc8\x14\x92\x29\x1b\x32\xef\xda\xd0\xad\xa8\x4f\xca\x72\x64\x3d\x7b\x3e\xab\xf4\x34\x0b\xa5\xec\x61\x86\x3c\xb9\xc8\xdb\xcc\xd0\xb2\x90\xf2\x5c\xc0\x8f\xd6\xf1\x78\x66\xa0\x05\x95\x12\x61\x76\x83\xa4\x4a\xdb\xca\x71\x7c\x67\x1b\x8d\xa3\x58\xc5\x43\x55\xd4\xed\x3a\x62\xc3\x47\x49\xd2\x84\xf7\xac\x0e\x93\xbf\xb1\x61\x61\xfa\xfd\x96\x16\xda\xdc\x3f\x94\x47\x28\x26\xef\x18\x7c\x55\x9c\x40\xca\xbc\x4c\x0b\x0c\x99\xa5\x69\x75\x2e\xea\xa2\x4e\xe4\xe5\x3d\x7b\x54\xdd\x5d\xab\xd5\x39\xcc\x08\x7a\x83\x23\x8a\x32\xd2\xff\x7d\x8e\x98\x1f\x33\x33\xb4\xe3\xff\xa8\x87\x9a\x33\xf2\xb6\xd5\x20\xbc\xf7\x40\xca\x13\xa6\xa6\x3e\x0f\xc1\x84\x8f\x29\x42\x2a\x85\xce\xe2\xc2\xec\x4d\xf1\xaa\x50\x60\xd2\x53\xd7\xba\x95\x2c\x13\x4b\xca\x48\xd5\x85\xb5\x53\x5f\x99\x2c\xc2\xeb\xbf\xae\x78\x4f\x0d\xce\xad\x12\xbb\x05\x01\x47\xae\x6c\x97\x4b\x3d\x2d\xa5\x0c\xa9\x77\x05\x4e\x74\x73\x91\xc8\xb4\xc2\xb6\x18\x0d\x06\xc6\x21\x37\x7f\xff\x5a\xcb\x69\x2f\x9c\x13\x8f\x1c\x77\x8b\x4d\xac\x81\x7d\x9b\xe6\x00\x5b\x86\x19\x15\x28\x6e\xb7\x0c\x8b\xb3\x87\x12\x4f\x58\x57\xbc\xc4\x1c\xc0\x4c\x27\xad\x4c\xb7\x77\x51\x49\xe2\x2c\x35\x97\xd3\xe8\x95\x0a\xd8\x2a\xdd\x9a\xd6\x58\x20\x76\xc9\x60\x5c\xcc\x32\x9c\xd0\x49\xbf\x37\x7e\xfa\x94\x7c\x5e\xb0\x17\xe2\x80\x6c\xed\x55\x1d\x02\x3c\x30\x0f\x3d\x9a\xbc\x27\xd3\xfb\x08\x21\x45\x14\xc7\xe8\x53\x2a\xa8\xc3\x66\x28\x5f\x99\xd4\x1f\xf5\x97\x4b\x8d\x2c\x8c\xa1\x2a\x59\xac\x55\x72\xea\x59\xb4\x0e\x9a\x7e\x7f\xf4\xdc\x25\x2d\xbf\x27\x5a\x95\x89\x22\x10\xf1\x22\x45\xd9\xa9\xb4\xf1\x9a\xb9\xdd\x3f\x54\xf8\xec\x1b\xa2\xdc\x07\x83\x6e\x05\x4e\xad\xf9\xaa\x1d\xcd\x5e\x7e\xcb\x34\x7b\x39\x06\x4d\xd4\x69\xa0\x4d\x29\x67\xde\x9e\xf4\xa9\x7b\x51\xa6\xdb\xb3\x4d\x9b\xac\x21\x10\xbc\x86\xed\xb5\xf5\x08\xb1\x69\xaa\x5a\xdc\x91\x67\x39\xc9\xf0\x04\x94\x43\x9d\xba\x63\xeb\x8e\xda\x0e\xea\x42\x9f\xaf\x60\x02\xc8\x0c\x05\x78\x72\x2f\xe2\x93\x69\x82\x98\x0b\xae\x8d\x91\x66\xc0\x0c\x9a\x95\x02\x9e\x9a\x80\x55\x6e\xb7\xc9\x95\xb9\x2b\x55\x09\x81\xb5\x9c\xc9\x3a\x13\x59\x17\x1f\x7e\xc8\x54\x0d\x18\x3a\x82\xbd\x75\xb6\xf2\xd6\x1d\xc3\x7c\x3f\xfd\x10\x6e\xcd\x12\xd5\x8c\xb8\xd0\x69\xef\x39\x56\xb7\x72\x52\x7e\x72\x02\x7a\x3d\x4b\x0c\x45\x5b\x2d\xe6\xd3\xf2\xb8\xba\x17\xc0\x00\x26\x49\x4a\xc1\x35\x02\x28\x9e\xd1\xfb\xde\xc0\x90\x21\x95\x85\x50\x7f\x68\x6e\x98\x71\xfe\x52\x78\x62\xed\xb2\xf1\xd7\x49\xbc\xd7\xbd\x14\xe9\xaf\xfb\x64\xd0\x3b\x9b\x9a\xd5\x2b\x4e\x75\x32\x6e\x73\x48\xd0\x1b\x2f\x97\x20\x80\x31\x12\xf4\xaf\x41\xd3\xdf\x68\x31\xb5\xc2\x7a\xac\xea\x42\xa4\x61\xb0\x46\x46\xae\xed\xea\x3a\xd8\x58\x03\x19\x60\x39\xb6\xa8\xcb\x82\xb0\x0f\x21\x0e\x2e\x7a\xa0\xa2\x7a\x6d\x13\xc8\x4d\x13\x2d\x01\xed\x34\x99\xc7\xdb\x9f\x89\xb4\x48\x6c\xfb\xd7\x05\xbf\x6a\xa3\x3a\xf0\x6f\x89\x4a\x2b\x1c\x3c\x50\x70\x9d\xbd\xd8\xe8\x5c\x65\x34\xd3\x64\x76\xd9\xa0\x93\x7e\x8f\x1b\x76\xdb\xa3\x9f\xab\x58\x5a\xfe\x12\x67\xce\x21\xba\x7b\x93\x66\x5f\x60\x66\x3b\x39\x46\x24\x40\x49\xc8\x9c\x09\xfb\x51\x33\x68\x71\xd8\x6c\x9c\x25\x1b\x41\x78\x21\x2a\x34\x93\x58\xbc\x35\x4e\x4b\xba\x85\x8a\xf5\x31\x8e\xaa\x87\xd6\x94\x29\x21\xf3\x78\xc5\xe4\xae\x0d\x2c\x15\x3b\xe4\x82\xf2\xda\xd4\xde\xa3\x7b\x4b\x5d\x93\x19\x9a\xf2\x51\x10\xe0\x04\x78\x8a\x68\x5e\x4e\x98\x67\xf9\x81\x35\x22\x69\x4e\x0a\x94\x43\x6a\x5c\x4d\xb9\x5b\x0f\x3c\x46\x97\x9e\x4f\x49\xfd\xd4\x63\x50\xaf\x81\xfc\xcd\xe9\x26\xa1\x52\x2f\xa9\x1d\x38\x96\xcf\x98\xeb\xa5\x76\xb3\xbc\x6b\x1f\x1c\x74\x12\xaf\x69\x84\xb5\xa2\x9a\xeb\x8c\xd6\x22\xb4\xe8\xec\xd8\x14\x64\xf4\x8e\xd6\x1d\xae\x29\x04\xdc\xa2\xb8\x6d\xfc\xce\x2b\x10\xb6\x43\x34\xad\x68\x90\x9d\x0e\x5b\xa7\x5f\xdb\x84\xa4\xea\x74\x2b\x57\xae\x0f\xb3\xba\xae\xe8\xcf\xcb\xf1\xba\x2a\x66\x33\xea\x99\xd9\x21\x9a\xaa\x2b\x14\xbc\x52\x5e\x5f\x53\x57\xf1\x1a\x5b\x1f\xcd\x03\xfe\x52\x06\xd9\xa4\x76\x0c\x0d\xf8\xad\xcc\xf2\xaf\xad\x67\xe9\x9d\xb3\x57\x52\xc4\x1b\x65\x94\x35\xe8\xfd\x66\x1f\xb1\x9d\x8e\x6e\xd0\xca\x95\xbc\x2f\x4f\xcd\xcc\x83\x39\xba\x72\xb6\x2b\xe3\xdd\x28\xe0\x5d\x2b\xdd\x56\x6a\x76\xad\xf3\x3b\xd9\xa9\xa1\xcc\xc9\xcf\x3c\xb0\x2b\xeb\x73\x9a\x59\x14\xa1\x65\x15\x7d\xc5\xab\x29\xd4\x5d\xb6\x97\xb7\xe5\xb0\x5d\x4c\x92\xb0\xf1\x60\xa6\xf9\x10\x70\xb7\x8b\xf2\x68\x16\xe4\xab\x2d\x86\x7a\x6a\x35\x96\x96\xcb\x0d\x68\x7f\xb8\x5c\xf2\x61\xb7\x3d\x91\xb2\x54\xf0\x3f\xed\x6b\x34\xae\xb6\x84\x6a\xbb\xf3\x34\x65\x53\xad\x35\xee\xd0\xe5\xb2\xd7\x5d\x35\x57\x1f\x8e\xf5\x09\x89\x9a\x0a\xaf\x9a\xce\x55\xf2\x49\xdb\x6a\xbc\xba\xa8\x61\x8d\xc2\xab\xf3\x3f\xdb\xab\x3d\xcf\x98\xe2\x66\x9a\xaf\x71\x90\xdd\x2b\x3e\x5f\x29\xeb\x49\x8f\xed\xea\x3e\xdf\xc0\xa1\x7b\xe1\xb7\xa8\xfe\x5a\x21\xb3\x15\xfd\xb7\xf3\xb5\x79\x4c\xeb\xf2\x55\xd7\x64\xe3\xd3\x85\xb5\x35\xa8\x0b\xba\xbf\x02\xf5\xa3\x81\x9f\x39\xf2\x95\x31\x7e\x58\x85\x7f\xb8\x1d\xda\x7a\xab\x5e\x55\xb7\xe8\x9b\xce\xab\xaa\x38\xab\xd9\xaf\xa2\x52\x5e\x25\x17\x88\x57\x9a\xff\xff\xc4\x38\xb2\xa6\xa3\xad\xe4\xfe\x4a\x1b\x69\x50\x8d\x42\x54\xc6\x3f\xa9\x9e\x67\x95\xdb\x0c\x80\x2d\xf5\xa0\x45\xed\xcf\x0c\xde\xa0\x37\x49\x51\xfc\xd3\x11\x0f\x78\xc9\xc7\x3c\x09\x04\xe2\xa2\x7c\xa7\x9c\xb5\x5c\x5f\xd4\xd3\xe9\xf8\xaf\x10\xaf\xf7\xf8\x35\x89\xee\x01\x24\x64\x1e\x23\x00\x13\x71\xa8\xcf\xd1\x03\x31\x82\x09\x01\x49\x0a\x64\x51\x07\x99\x47\x94\xc8\xfa\x90\x0c\x01\x98\x21\xf6\x52\x64\xb2\x12\x00\x67\xb3\x08\xa3\xb0\x48\x4f\xe8\xbb\x56\x9f\x57\xf3\xfe\xfb\xdf\xae\xe5\xe7\x19\x0b\x83\xfc\xc6\x05\x8d\x10\xb2\x04\xa9\xb8\x58\xa5\x53\x2a\x09\x61\x0f\xb4\x34\x04\x43\x62\x48\x6e\xdc\x00\x5c\x7e\xa3\x87\x5f\xc9\x54\x75\xa0\x7c\x53\x58\xea\x8d\x0a\x6e\xd0\x8b\x8d\x2c\x15\x51\x9d\xce\x14\x92\x5f\xd8\x72\x8c\x4f\x44\xa1\x4b\xa7\x7c\x39\x0c\x56\x97\xe5\xf0\xcb\x68\x72\x26\x39\x11\xed\x65\x21\x78\x0e\xe5\x04\x60\xf0\x17\xb3\x18\x29\xbf\xea\x0c\x4f\xc0\x13\xb3\xfa\xe8\x89\xec\x95\x57\x93\x97\x88\xd5\xf9\x6e\x4b\x8c\x8c\xba\x75\x41\xf5\x55\xb7\xdb\xb1\x96\xeb\xf1\x2d\x6a\xaf\xd7\xd3\x85\x91\x58\xf1\xcd\x6f\x10\xf8\x46\x2e\x0f\xd8\xc1\xd5\x77\xfa\x9e\xc4\x13\x6d\x0b\x55\x89\xa4\xde\xf1\x75\x2b\x5d\xef\xda\x98\xef\x58\xbe\xfe\xea\xfb\xb8\xfd\x44\xdd\xbc\xb5\xbf\xe1\xe4\x81\x6e\x38\xc9\x19\xd7\x71\x73\xad\xb8\xbf\xa9\xe1\x72\x93\xa2\xd1\xa6\xf7\x9b\x6c\xe1\xf6\x92\xbd\xec\x61\x32\xa3\x74\x83\xde\x86\x5f\xa4\xe3\x55\x30\x5a\xb9\x0b\x5f\xbf\x06\xc2\xa8\x4f\xb5\xb6\xb4\xd4\x92\x9a\xed\x6a\x8b\x47\xcd\xa6\xdb\xab\x16\x35\xe1\x3e\x96\xf2\xd0\x12\x56\xdb\xa9\x07\xd5\xae\x56\xb1\xac\xae\x57\xb5\xa7\x84\xf1\x6e\xdd\xaa\x60\xb3\xff\xba\xd4\x69\x59\x3c\x7b\x5e\x33\xa8\xfc\x8a\x47\x47\x03\xd7\xe5\x33\xfb\x5a\x04\x7b\xc2\xdd\x6e\x13\xf8\x5b\x67\xe6\xef\xab\x12\xb6\x55\x95\x60\xca\xa3\xdd\xd7\x21\x6c\xa1\x1a\xd6\x23\x0b\xbc\x75\xf4\x1f\x4f\x40\x63\x3c\xbc\xa1\x18\xcb\xa8\x8c\x68\x1f\xe3\x96\x18\x6c\x77\xf4\x8d\xaa\x3b\x2c\x41\xc7\xef\xa6\xd8\x63\x8d\xaf\x47\xda\xd7\x87\x7c\x13\xf5\x21\x3b\x39\xd9\x2c\x0f\xb2\x2f\x42\x59\xe7\x4e\x80\x7a\xc4\x5b\xca\xdf\x8d\xeb\x50\x5a\x97\xe0\x37\xa3\xff\x80\xa8\xef\x4b\x80\xf6\x25\x40\x3b\x2c\x01\xe2\xf1\x6a\xaf\x5a\x9f\x7d\xb1\xcf\xbe\xd8\x67\x17\xc5\x3e\x9b\x95\xfb\x7c\x85\x82\x1f\x4f\xf9\xb6\xfb\xaa\x9f\x87\xae\xfb\x59\xbf\xf0\x67\x1d\x4f\xed\x2b\x56\xff\xac\x65\x3d\x7c\xa5\x12\x20\xff\xd4\xd6\x5d\x8c\xed\xa3\x66\x77\x93\xc0\xb2\xfb\xe5\xf6\xc8\x5f\xdd\x5a\x4d\x90\x17\x25\xf7\x75\x41\xfb\xba\xa0\x7d\x5d\xd0\xbe\x2e\x68\x5f\x17\xb4\xaf\x0b\xda\xd7\x05\xed\xeb\x82\xf6\x75\x41\x95\x54\x25\x07\x79\xf6\x75\x41\xfa\x67\x5f\x17\xb4\xaf\x0b\xda\xd7\x05\xed\xeb\x82\xf6\x75\x41\xfb\xba\xa0\xaf\x56\x17\x54\x1c\x92\xb6\xfe\x6e\x0c\x7d\xac\x3c\xf3\xeb\xe3\x3a\x5f\x56\x51\x07\x68\x37\x99\x6d\x45\x72\xa2\x31\x76\x91\xe2\x56\x93\xab\xe8\x46\xb0\x0c\x8e\x9b\x48\x67\x84\x67\x6c\x8c\x4f\xe4\xb5\xc3\xe4\xf4\xf7\x39\x8c\x2a\x60\x4a\xab\xe9\xa7\x85\xf3\x11\x38\x90\xd6\x43\x78\xbb\xb8\x49\x4a\xcd\xc9\xd4\x37\x11\xd8\x68\x6d\xb8\x71\x57\x8f\xcc\x5a\x46\x9e\x7b\xad\x36\x34\xf6\xea\x71\xdd\xc0\xe8\x6b\x6f\xf2\x35\x91\xcd\x0e\x7e\x2d\xc3\xaf\xc5\x50\x2d\x4f\x20\xd6\x34\x02\x7d\x4d\x8d\x56\x34\xaa\xf2\xc3\xa6\x06\x61\xd3\xf0\xd5\x88\x77\xdd\xc1\xd5\x16\x8d\xc3\x35\x11\x2b\x99\x24\x9b\xa4\x70\x3c\xd8\xfa\x3d\xd6\xb5\x7b\x1c\xeb\xd6\x60\xe9\xfa\x18\x58\x4d\x38\xf9\x1b\x5a\x8d\xb3\xb3\x5a\xc9\x55\xf9\xd3\xf6\xbb\x16\xb6\x10\x6b\x69\xb7\x30\x2e\x63\xd1\x69\x85\xd5\x1b\x6c\xe5\x35\x56\xd5\x11\x0d\x16\xc6\x3b\xab\x25\xd1\xa8\xfd\x35\xf0\xf5\xe6\x85\x03\x7e\x83\x01\xa3\xdb\x0d\xda\x24\x6a\xde\x97\xcc\x0a\xdd\xa8\xb0\xa3\xb0\x89\x4d\xb1\xf5\xf8\x51\x2d\xa6\x0f\x1c\x46\x6a\xa0\xda\x56\xa3\x49\xbe\x63\x3d\x96\xd3\x94\x36\xb4\xd9\x89\x19\xe1\x1a\xf9\xc1\x4f\x56\xda\xe3\xf3\x80\xe7\x2b\x9b\x2d\xd3\x23\x5b\xa2\xaf\xbc\x3c\x8e\x13\x97\x16\x56\x81\x0b\x89\xd6\x46\x81\x73\x36\x8f\x2e\x08\xd3\x82\xfc\x2d\x63\x31\x65\x1d\x6f\xfb\xf2\xf9\x47\x70\x4b\x89\xcf\x7d\x1c\xa5\x0b\x26\xf6\x97\x6f\xec\x2f\xdf\xd8\x5f\xbe\xf1\xd8\x0a\xe0\x37\xbf\x7c\x43\x52\x8e\x1b\x8a\x37\x04\x6f\xf8\x65\xb9\xf6\x92\x77\xf1\x1d\xfb\x0d\xd5\xee\xb7\xe4\xc5\xba\x76\xaa\xed\x9b\xf6\x5b\x57\x2c\xb7\x2c\x58\xf6\xb9\x63\xc4\x41\x4f\x55\xb1\xb7\xcb\x4b\x46\xd8\xfe\x1d\x80\xbe\xbb\x1c\x9a\x2b\x15\xf1\x8d\x68\xdf\x41\xc1\xa0\x85\x05\x2c\xb5\x82\xb6\x56\x0f\x50\x26\x68\x47\x6e\xdd\x0a\x41\x69\x26\x59\xf6\x4b\xc9\xd7\xaa\xb8\xb9\x35\xe5\x74\x16\x14\xeb\xcb\x00\x2a\x1d\x6a\x6e\x71\xb1\x03\x17\x22\xac\xb9\x8c\x47\x33\x0d\x6d\x73\x6e\x57\x62\xd4\x80\xd6\x46\x55\x45\xf6\xcc\xd9\xb1\x2b\x71\xd6\x32\x7c\x25\x67\xd6\xc9\xb0\x4c\x0b\xff\xae\x9b\x7a\x6e\x95\x5c\xa3\x8d\x37\xd7\xc2\x09\x8e\x86\xdf\x8a\x2a\xe6\xb8\x6e\x51\x1f\x57\xe7\x5e\x28\xe5\x26\xf3\x5a\x07\x21\x26\xe2\xaf\x8f\xf2\x69\x16\x95\xe7\x6b\x6b\x21\xd6\xbd\xf6\x7b\xc8\x8d\x0d\x63\xd3\x39\x6e\x3f\x87\xf9\x30\x06\x33\x1b\x17\x6f\x38\xf4\x52\x57\x39\x0a\x4e\x0f\xa3\x4a\xd7\xcb\x9f\xae\x86\xe0\xc0\x39\xd6\xe0\xe7\xaa\xe7\x51\x5e\x42\x81\xb7\x7c\xea\x06\x35\xb4\xdc\x5b\xa6\x9f\xc1\xf3\xbd\x43\x2e\x02\x98\x90\x8a\x5d\xa4\x2f\x61\xd3\x65\x67\x24\x80\xc9\xf6\xae\x54\xb9\x68\x07\x6d\x37\x77\xaa\x10\x5e\x73\x59\xb1\x31\x2e\xf2\xc7\x15\x13\x83\x7f\x6a\xed\x8c\x72\x4d\xa6\xff\x97\xb2\x01\xe1\x82\x8d\x0b\xd9\xae\x39\x45\x15\x23\xa6\x8c\x49\x8d\x25\xe3\x57\x6d\xa0\x27\x4b\xbc\x48\x42\x75\x17\x95\xb2\x8b\xb9\xc1\x3c\x4f\x70\x9a\x68\x8f\xea\xf3\x22\xaa\xb6\xb7\x99\x1e\xc2\xd8\x02\xe2\x84\x7c\x48\x13\x65\x02\xd4\x86\x7d\x1d\x88\xc9\x6d\x8e\xca\x35\x12\x7e\xf7\xd8\x59\x08\x53\x17\x1e\xb0\x38\x51\x82\xa3\x50\x12\xa4\xbc\x4e\x47\xe1\x01\x08\x03\xca\x6f\xd7\x98\xa4\x19\x67\xb7\x5c\x8e\x2b\x0d\xd3\x1f\x38\xee\x87\xe1\xce\x79\x3c\x27\x14\xcc\xb2\x74\x81\x43\xc4\xdd\xf4\x09\x46\x51\x48\xd8\xc6\x22\x14\xd3\x39\xc3\x98\x3f\x17\xea\x02\x26\x21\xff\x4b\x92\x8b\x8d\x9c\x43\x9a\x52\x3a\x23\xe3\xe3\x63\x42\x61\x70\x9b\x2e\x50\x36\x89\xd2\x2f\xa3\x20\x8d\x8f\x7f\x9f\x23\xc2\x34\x13\x39\xfe\xe3\x4f\x7f\xfe\xd3\x9f\xfe\xf3\xcf\xff\x7d\x9c\xd3\xeb\x68\x06\x6f\x70\x02\xd9\xdb\xa3\x2f\x98\x4e\xf9\x0f\x35\x3d\x3e\xbb\x5b\x74\x7f\x94\x26\x47\xf0\xe8\x86\xdf\x61\x76\x44\xf2\xf5\x39\xe2\x28\xf1\xe1\xd5\x3e\xdb\xb4\x8c\xa5\x6c\xf9\x48\x25\x23\x9c\xb9\x7a\x26\x71\x14\x60\x2d\xeb\xaf\x74\xb0\xb9\x71\xa2\xa3\xd3\x78\xf7\xb3\xa2\xcb\x86\x70\xc3\x71\x4f\xd5\xb4\xb5\x1d\xf1\x68\xa6\xeb\xca\x6e\x34\x56\x83\xb4\x35\xf3\xb0\x6d\xa9\x4b\x67\xfb\xab\x9a\x11\x5d\x05\x70\x56\x3d\xed\x1f\x8e\xc4\x49\x82\xb2\x22\x1a\x09\xec\x16\x27\x13\xe7\xf6\x18\x90\xe2\xcb\xa1\x50\x2b\xa9\x11\xb6\x64\xfd\xea\xa3\x96\x5c\x48\x78\x05\x20\x53\x9f\xc0\xa3\x9a\xce\x89\x45\xba\x70\xc8\x6c\xb7\x3b\xe4\x87\x35\x42\xc9\x7e\x3a\x22\x92\x72\x48\x23\x54\x57\xbd\x35\x4b\x37\x7d\x8c\x86\xa3\xdf\x20\xe6\x54\xb4\x59\x32\x95\xe9\x14\x61\x54\x2b\xa2\x40\xfb\x2e\xfa\xfc\x37\x26\x7f\x83\x84\x72\x2b\x91\xa7\xca\xe5\x0b\x70\x70\x00\x30\xb3\x59\x8d\x30\xa9\x42\x95\x4c\xd3\x79\x14\xb2\x45\xc6\xc9\x9c\xdb\x9a\x66\xd4\x54\x83\x3a\xf8\x19\x3c\x29\x35\x6f\x88\x3c\x8a\xdf\xdf\x5d\x40\xb5\xf8\xa9\x07\x55\x01\x58\x0d\x72\xc3\x41\xae\xa3\xcd\x5a\xcd\x5f\x9a\xd6\x2a\x5b\x6f\xc3\x22\xb5\x18\xa7\x34\x83\x09\x81\x01\xd7\x3c\xa7\x09\x33\x8a\x42\x5d\xe4\xc9\x4e\x52\xc2\xe7\x8d\xd9\x16\x16\x02\x5d\xf9\x12\x85\x05\x22\xa0\x7c\xd2\xe0\xaa\x48\x9e\xde\xff\x17\xb5\x33\xc7\x27\xba\xa3\xe1\x18\xa3\xd9\x32\xce\x3b\x5e\xc0\x45\x65\xeb\xbf\x48\x42\xf6\xc8\x3e\xbe\xcb\x4a\x8e\x9f\xb9\x7c\x11\xf6\x4e\x39\xf4\x04\x1c\x22\xe5\xd3\x8f\xd4\xe3\x97\x73\x1c\x85\x28\x1b\x82\xf8\xb9\x0e\xc6\x85\x02\x6b\xe7\x09\x52\xb7\x9d\x43\x48\xe1\x33\x25\xf7\xb8\xed\x53\x75\x8b\xe2\x67\x83\xae\x5d\xda\x69\x8c\x22\x7d\x33\x31\xb1\xd3\xbb\x19\xc3\xfc\x19\xfb\xfd\x0f\x18\x91\xfc\xff\xdc\x41\x54\xc3\x5d\x33\x7c\xf2\xe6\x7d\x9d\x24\xfe\xe3\xb1\x09\x3c\xb7\x4c\xc0\xb9\x54\xf1\xf3\x16\x93\x79\xae\x4d\xe6\xb9\x36\x99\xe7\x8d\x93\x79\xde\x7e\x32\x1d\x5c\x75\x62\xf2\x6d\xf0\x5b\x86\xc5\x05\xc1\x44\xdd\x10\x9c\xbf\xe2\x4f\xc7\xe0\x52\x33\xbb\x2a\xbd\x78\x88\x43\xc4\x39\xce\xe7\x54\xb7\x6d\xce\x73\xff\x48\x7c\xbc\x2e\x19\x66\x1f\x06\x55\xfa\x2f\x82\x87\xc4\x63\x6b\x98\x4a\x7c\x34\xce\x10\x6d\xeb\x22\xa2\x05\xe7\x38\xdb\xca\x28\xae\xc1\x59\xbc\x31\xbf\xbf\x59\xfe\xac\x9f\x73\xc7\x75\xab\x72\xe9\xf4\x97\x1c\xd5\xb1\x94\x08\xe8\x9c\x67\x68\x82\xef\x06\x0e\xfa\x3c\xf7\xa0\xcf\xf3\x16\xf4\x79\xde\x82\x3e\xcf\xdd\xf4\x61\x3f\x56\x00\x74\x01\x70\x5c\x5f\x5d\xe5\xbf\x8a\xf9\x25\xbf\x80\xa3\x56\x6d\x28\xad\x71\x7c\xec\x10\x32\xf2\x31\x01\xb0\x22\x9f\x01\x64\x4f\x73\xac\x98\xa3\xc1\xf4\xb1\x72\x02\xc1\x82\x13\x65\x24\xe4\xbb\x4b\x84\xb9\x44\xf1\x00\xf4\x3d\x3c\x17\xed\x50\xa3\x94\x82\x66\x78\xbc\xd2\x87\x95\x74\x68\x7b\xed\x7a\x1e\x75\x33\x9f\x8e\x41\x3c\x14\x6a\xdc\xb4\xfa\x17\x30\x5a\xfb\x82\xf7\xa6\x91\x6a\xe5\x55\x29\xb2\xa5\x0c\xa6\x18\xde\x22\x40\xe6\x19\x2a\x82\xfb\xc5\x22\x11\x69\x1f\x05\x22\x56\x00\x08\x9a\xc1\x0c\xd2\x34\x03\xc1\x14\x66\x30\xa0\x28\x23\x46\x6a\xc4\x0f\x84\x66\xe7\x59\x3a\x43\x19\xc5\x88\x9c\x15\x91\x05\x52\xa4\x1c\x3a\xde\x9b\xe6\x87\x0e\x54\x8b\x66\x12\x34\xe3\x80\xd2\x8c\xa2\xf0\x3d\xba\x27\x75\x23\xda\xc1\xa8\x69\xb2\x5e\xda\x39\xa4\x1b\x0e\x1f\x35\x0f\x45\xca\xb4\xc9\x51\x1e\x3e\xe9\x2f\x97\x05\xbd\x3e\xa5\x5c\xc2\x54\x4f\x47\xcc\x41\x7b\xf1\xa8\xc7\x95\x3f\xf7\xe7\x04\xf4\xde\xc0\xb2\x5e\xba\x27\x92\x47\xe7\x0a\x30\xc5\x95\xa0\xf9\xfa\xfc\x58\xc0\xfb\x31\x0f\x76\xac\x8f\xdf\xc0\xe0\x95\xa6\x0c\xd8\xe3\x63\x00\xc3\x10\xe0\xc4\xca\x48\xe5\xdc\x40\x23\x04\xd5\x10\x7f\x6a\xae\x5d\x9a\xa9\xaf\x3e\xd8\xca\xb7\x27\x58\x18\xcf\xf3\xfb\x13\x40\x25\x82\xfe\x75\xbe\x41\x21\xae\x1c\xbe\x35\xf3\x80\x05\xca\xa8\x67\x7e\xc1\x02\x28\x7d\x0c\x06\x68\x29\x81\x98\x6b\x7c\x3b\x04\x8b\xc2\x3b\x2e\x56\x51\x76\x5c\xc0\xe8\xf2\xf6\x0a\x9c\x80\x85\x0f\x27\x6e\x72\xd3\xff\x06\xdc\x69\x0d\xb3\x6a\xc7\x05\xe5\xb8\xf0\xda\x1c\xfa\xf6\xe2\xcc\x64\xad\x32\x64\x2b\xe3\x92\xdb\xfc\xd0\xa7\x89\x53\x49\x7b\x4e\xb5\x74\xa9\xe7\xd4\x4a\x87\xb5\x38\xd5\x02\xe5\x61\x39\xb5\x76\x81\xd7\x62\x5e\xf5\x48\xa2\x90\xdb\x09\xba\x41\x26\x0c\x31\x7b\x94\x4b\xf8\xc1\x11\xa4\x76\x5b\x8c\xd0\x34\x43\x5c\x38\x2b\x83\x8c\xa6\xf6\x86\xd9\x3c\xa0\xd2\x2a\x73\x9c\xb7\xc5\x3e\x51\xe3\x21\xe0\x01\x3d\xa7\xfd\x56\x38\xb3\x0b\x98\x01\x0b\xbb\xdb\x9e\x99\xa7\x81\x95\xfd\xf3\xf7\x24\x2e\x76\x50\x3c\x04\x07\x16\x10\x35\x87\x7f\xc5\x8a\x1f\x32\xdc\x4f\x6c\x18\xd8\x0e\x28\x0d\xd1\x21\xcb\x4a\xd3\x7f\xa1\x20\x3f\x46\xcb\x83\x9f\x65\x31\x42\x94\xe2\x9c\xc1\x8c\x38\x0c\xb0\x49\x96\xc6\x40\xc1\x03\x2a\xc2\x2f\x64\x14\x5b\xed\x24\x04\x13\x1c\x45\x02\x12\x4e\x84\xc9\xcc\xba\x48\x5b\xc6\x26\x24\x4d\x04\x5d\xe8\x89\xb8\x7e\x8b\xa9\x54\xc6\xb9\xb5\x01\xf1\x04\xb1\xd6\xc9\x80\x34\x43\x03\xc8\xc3\x8f\x38\x09\x1b\xa4\x77\x1d\x24\x3c\x01\x8b\x3c\x39\x21\xae\x89\xbd\xf3\x34\x85\x83\x03\xb0\x18\x5d\x98\x7c\x35\x83\x19\xd5\x0c\x5f\x32\xba\x98\x45\x98\xf6\x0f\x17\xa3\x0b\x69\xfb\x05\x70\x74\xa1\x6c\x6a\x75\x4d\x99\xcc\x17\xe0\xdd\x07\x0c\xe4\x72\x29\xf8\x2a\x80\xa3\xc2\x46\x2d\x44\x8d\xfd\x5c\xec\x6e\x26\x58\xc6\xd9\x99\xc3\x1f\x83\x1f\x9f\x3e\x25\x3f\xf6\x86\x80\xa1\x35\xd0\x02\x92\x65\xf1\x29\x97\x14\x0f\xf9\x7a\x72\xd3\xb9\x02\x93\x77\x4c\x2b\xb7\xf8\xcd\xa4\xb9\xca\x66\xe2\x93\x88\xce\x5b\x1f\xc8\x84\x73\x8e\xe6\x25\xa3\x16\x06\xab\xd5\x55\x83\x68\xf7\x16\xb4\xad\xc4\xb1\xfc\x3e\x21\xa7\xf8\x25\xa6\xfc\x8d\x30\xe1\xd1\xe7\x6a\x33\x97\x20\x26\x11\x0e\x90\xad\x8b\x94\xc8\xa4\x56\x24\x93\x7e\x4c\xc0\xe5\x95\x87\x58\x1e\x80\xfe\xe5\x95\x4f\x0e\xa0\x33\xe5\x41\xe4\x7f\xc2\x5b\x54\x07\x88\xb1\x6f\x4c\xf8\xe9\x08\x3f\x02\x19\x82\xb8\xd0\x9e\xea\x08\x64\xdd\x8c\x10\x8f\x9c\x90\xb8\x6d\x02\x88\x4d\xf9\x17\x5f\xad\xe0\xa2\xc5\x25\xbe\xe2\x4c\xed\x78\x6f\x06\xe6\xdd\x60\xf2\x34\x92\xff\x0f\x00\x00\xff\xff\xa2\x10\xab\xda\xbe\xda\x00\x00") func tableGoTmplBytes() ([]byte, error) { return bindataRead( @@ -169,11 +169,11 @@ func tableGoTmpl() (*asset, error) { } info := bindataFileInfo{name: "table.go.tmpl", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf0, 0x71, 0xf2, 0xe9, 0x10, 0x58, 0x73, 0x5a, 0x4a, 0x89, 0x1d, 0xf6, 0xce, 0x96, 0xe3, 0x38, 0x79, 0x66, 0x67, 0xfe, 0x88, 0x8e, 0x97, 0x2b, 0xd3, 0x7d, 0x3a, 0x96, 0x71, 0xd2, 0x6b, 0xfb}} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc5, 0x19, 0x2b, 0xdd, 0xb1, 0x93, 0x42, 0x9e, 0x9c, 0x28, 0xe8, 0x6f, 0x24, 0xf9, 0xe1, 0xc5, 0xdc, 0xee, 0x0, 0xcd, 0x95, 0x59, 0xe7, 0xd0, 0x1d, 0xed, 0x39, 0x22, 0x34, 0xc0, 0x37, 0x5c}} return a, nil } -var _testsGoTmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x3d\x5b\x6f\xdb\xb8\x9a\xef\xfe\x15\x5c\xef\x60\xd6\x1e\xb8\x4a\x93\x2e\x16\x58\x03\x79\x48\x9b\x36\xcd\xf6\x4c\x27\x48\x72\xce\x2c\x70\x30\x18\xc8\x12\xed\x70\x2b\x51\x1e\x92\x6e\xe3\x35\xfc\xdf\x0f\x48\x4a\x14\x25\x51\x57\xdb\x89\x9c\xd0\x0f\x6d\x2c\xf3\xf2\xdd\xf8\xdd\x48\xf1\x5b\xba\xde\x37\x77\x01\x01\x83\x94\xd1\xc1\x00\x85\xcb\x88\x30\x30\x1a\x00\x30\xf4\x22\xcc\xe0\x23\x1b\xf2\xbf\xf9\xcf\x08\x2f\xc4\xdf\xf3\x50\x3c\xdb\x6c\xde\x00\x34\x07\x2e\x5e\xdf\xbb\xb3\x00\xfe\x9d\x42\x7a\xe9\x32\x78\x8f\x42\x08\x9c\xff\xbd\x7c\xff\x21\xc2\x73\xb4\xa0\x60\xbb\x1d\x00\xc0\x87\x40\x21\x4c\xfa\x41\xec\xf3\xe7\x7c\xb4\xcd\x06\x38\xbf\x46\xfe\x2a\x80\x5f\xdd\x10\x82\xed\x76\xb3\x71\xae\xa2\xdf\x56\x6c\xb9\x62\x37\x2e\x7b\xd8\x6e\x4f\xc2\xc8\x87\x01\xdd\x6c\x9c\x7f\x40\x42\x51\x84\xef\x56\xf3\x39\x7a\xdc\x6e\x87\x49\xff\x1b\x89\x44\x3c\xc0\x09\x7f\x94\x0e\x00\xe2\x86\x0b\xc4\x1e\x56\x33\xc7\x8b\xc2\x13\xca\x08\x64\xde\x03\x39\x11\x68\xcd\xd7\x27\x04\xfe\xb5\x42\x04\xb6\x46\x4b\x1f\x74\x11\xbd\x89\x96\x10\xbb\x4b\xc4\xc7\x8f\x89\x24\x3f\x1a\xca\xe3\xc1\x60\xb3\x69\x3a\xc1\x7c\x85\x3d\x10\xae\x28\xe3\x3f\x8e\x28\xa0\x8c\x20\xbc\x18\x03\x39\xbe\xa3\xba\x6d\x06\x00\xb0\x09\x80\x84\x80\xe9\x39\xe0\x84\x76\x6e\x5c\x42\xe1\x48\xfc\x79\xfb\xe9\xc3\xbb\x77\xef\xfe\x7b\x02\xe8\x78\x00\xf8\xd4\xbc\xdd\xbf\x9d\x03\x8c\x02\xd1\x13\x80\xa5\x8b\x91\x37\x82\x84\xf0\x06\x1c\x2f\x02\xd9\x8a\xe0\xfc\x3c\x23\x36\x1e\x6c\x07\x1a\x32\x66\x4c\x4a\xb1\xe0\x3f\x9a\xb1\xa8\xc1\x80\x37\xf9\x0d\x07\xeb\xdd\x50\x28\x80\x2f\x21\x5b\x46\x08\x33\x48\xee\xa3\x3b\x01\xd7\x88\x32\xa2\x40\xfc\x45\xfe\xb1\x49\xc7\xfb\x99\x32\x32\x48\xba\xde\xae\xf0\xe5\xfb\x7b\xbe\x72\x46\x0c\xfc\x12\xaf\x11\xe7\x7e\x02\xfc\xd9\x27\xd7\x63\x11\x59\x03\xde\x6e\x34\x06\xfe\xcc\xb9\xe6\xb3\xcc\x5d\x0f\x8e\x05\xc8\x1c\x8e\x9f\x1e\xfd\x59\x42\xa8\xe9\x79\x51\xbc\x78\x1b\xe2\xe2\x05\xd4\x5a\x96\x36\xfc\x49\x2c\x13\xb1\x06\xa6\xe7\x60\xe9\x52\xcf\x0d\xd0\xff\xeb\x5d\x9d\x3b\xef\x01\x86\x6e\xbc\x4c\x38\xc5\x9d\xdb\x15\x1e\x0d\xaf\x20\xdb\x6c\xf4\xfe\xdb\xed\x70\x02\x0c\x4f\x47\x0a\xaf\xd1\x78\x02\xd8\x78\x9c\x91\x70\x34\xd7\xe7\xba\x08\x82\xe8\xc7\x0d\x41\xa1\x4b\xd6\xd7\xd8\x87\x8f\x77\x9e\x8b\x33\xd3\xf2\x07\xf9\x19\xe8\x70\x02\x8c\xcf\xab\xa7\x8e\x19\xaa\xe0\x40\x7c\xc2\xcf\x2e\xbd\xe5\xc4\xfb\x02\xd7\x3a\x60\x97\x6b\xec\x86\xd1\xe5\x7b\xe7\x0b\x5c\x4b\x82\x68\x34\x14\x1d\x13\x1a\xa6\x5f\x1a\x74\x2f\xa7\x25\x7d\xbf\xe6\x8f\xd2\xd1\xca\xc8\x6b\x68\x68\x42\x3b\x83\x70\x42\x4b\xf7\x3b\x34\xf0\xd0\xf4\xd8\x34\x64\x3c\xca\x25\x0c\x20\x33\x8d\x63\xfe\xa1\x0c\xb8\x58\x64\x17\x14\x71\x2a\x9a\x68\x77\x15\x44\x33\x37\xb8\x83\x5e\x84\xfd\x44\x3e\xa0\x2e\xcb\x5e\x14\x2e\x57\x0c\xfa\xd7\x25\xfc\x58\x50\x64\xe2\x9f\x91\xf5\x86\xb6\xb5\xcc\x2a\xce\x5f\xc3\x34\x53\x87\x52\xe6\x05\xb4\x76\x01\xb6\x05\xa3\x03\x14\xa6\x35\x23\x56\x2d\xe5\x2b\x90\xea\x3a\x47\xd0\x50\x1f\xb4\x66\x15\x57\x42\xdf\xb2\x47\x23\xf8\x63\x91\x63\xc4\xc5\xd4\xf5\xd8\xef\x88\x3d\x68\xca\x2e\x2b\x85\x1f\x31\xb7\x56\xf7\x71\x53\x14\x61\x5d\xf0\xf4\x11\x7e\x2d\x51\xa8\x25\xb3\xe8\x54\x49\x46\x37\x2d\xc0\x0b\xec\xf3\x47\xe6\x99\x04\x85\x76\xe8\xdd\x88\x5a\xea\x4b\x41\x83\x6e\x85\x7b\xd2\xc0\xe6\x74\xb2\x38\x6a\x69\x47\x14\x31\x78\xc1\x18\x41\xb3\x15\x83\x37\x24\x5a\x42\xc2\x10\x14\x56\x70\x01\xd9\x87\x42\x93\x0b\xec\x17\x1f\x0a\x29\xd1\x3a\xa7\xf3\x26\x73\x2d\xbf\x09\xda\xa8\x1e\x1c\x10\x31\x49\x58\x7c\xfc\x29\x22\x62\xc0\x8c\xdc\xd7\xe9\x7d\x31\x0b\x8e\xf0\xcd\x17\xa5\xcc\xa4\x1b\x91\xc5\xa9\xa6\x85\x36\x63\xe2\x2f\x99\xac\x2f\xcd\xb8\x11\x13\xa0\xfb\x1c\x63\xe9\x69\x64\x1f\x69\x7e\x4b\xc9\xaf\xea\xe3\xb1\x47\x0e\x68\xec\xf3\x3b\xef\x5d\xef\xdb\x82\x44\x2b\xec\x8f\xa4\xa5\x0d\x15\xd5\xa8\x93\x07\x2c\x19\x48\x5b\x88\xae\x4e\xda\x12\x82\xe7\xd0\x4e\xa5\x51\x17\xa5\xec\x40\xdb\xed\x94\xff\x0e\x1f\xdd\x70\x19\xc0\x7f\xb8\xc1\x0a\x7e\x8a\x88\x1a\x36\xc3\xba\x6c\xcf\x53\xb0\xdd\x4e\x06\x06\x8f\x41\x7a\x8b\x9c\x4e\x22\x04\x70\xbe\xa2\x60\xc4\x26\x80\x3a\x46\xdb\xe9\xb1\xc7\x09\x08\x63\xef\x23\x3c\x53\x1e\x2b\x75\x4c\x0c\x13\xad\xd3\xf5\x54\x20\x4a\x89\x7c\xf2\x18\x08\xa8\xc6\xf7\x91\x68\x23\x90\xad\x40\x70\x18\x3a\x43\x8e\x23\x27\x8f\xc0\x6d\x6c\x42\x2b\x76\x90\xab\x79\x55\x0a\x96\xea\x29\xfa\x5c\x45\xf7\xeb\xa5\xe8\xb0\x10\x7f\x35\xe4\x84\xc6\xea\x9c\xf7\x08\xff\xca\x0c\x3c\xcc\x85\x1f\xc3\xa4\x6b\x82\xd3\xc7\xbf\x56\xae\xc0\x2a\x74\xaa\x85\xc6\x89\x5d\xfb\xf1\x04\x84\x67\x4d\xdb\x8e\x8d\x60\xa6\xb6\xdb\x00\xc7\x0e\x6c\xeb\xd6\xf7\x4c\x74\x4e\x39\xaa\x49\x75\x36\xcc\x06\xe0\x4f\x29\xab\x55\xa2\xda\x60\x19\x97\x88\xc6\x1b\xc5\x54\x31\xad\xb6\x3c\xbf\x46\xec\x86\x91\x86\xa2\x71\xc6\x07\xca\xaf\xd2\x37\x06\x81\x29\xf2\x46\xc9\x79\xc4\xf2\xa2\x9e\xfc\x74\x4d\xb9\x58\xc5\x3f\xf1\x18\xcd\xf9\x48\x48\x9e\x10\x5f\x23\xf6\x89\xab\xbd\xcd\x56\x06\x92\xc2\x20\x76\x8c\x29\x76\x8a\x28\x44\xe7\x07\x97\x3e\xf0\xa9\x92\xae\x35\xdd\xde\xe6\x3b\x2a\xa2\x57\x18\xbd\x2f\x70\x2d\x96\x5b\x63\xb3\x37\xfc\x7c\x71\xf7\x79\xa8\xa6\x22\x09\x3d\x1a\x02\x79\x5a\xe8\x79\x18\x28\x6f\x2f\xbe\x5e\x7d\x4c\xc1\x0c\x20\xbe\x35\xce\x17\x40\x6c\x04\x65\xbb\x1d\x30\x3e\xe3\xa2\x51\xa0\x76\x8d\x97\x2b\x06\x28\x23\x2b\x8f\x09\xcb\xca\x0d\x2a\x50\xf6\xf4\x83\xfc\x7f\x00\x00\x12\x0d\xfd\x99\x69\x15\x96\x8d\x3b\x68\x05\x8a\x4c\x7d\xe9\xb0\x6c\x36\xc0\x73\x43\x28\x15\x5e\xa6\x37\xf8\xe7\x1f\x25\x46\x7d\x00\x84\xbe\x00\xe2\xbf\x88\xb4\x03\xe1\x1e\xd2\x0c\x00\xdc\xeb\x10\x3f\xc9\x7c\xca\x00\x00\x5f\x2e\x5b\xdd\xa1\x51\xc4\x69\x43\xf2\x01\x00\x91\xc4\xb7\x0d\x71\x54\x06\x67\xb4\x68\x81\xd1\x18\x90\x15\x36\x38\x51\x15\xe4\x9d\x9e\x97\x53\x78\xc3\x69\x3c\xc7\xbc\x8d\xf0\xce\x42\xf0\x4b\x49\xcb\x09\x08\x5c\x5a\x80\x12\xcc\xa2\x28\x18\x8b\x7f\x63\x5f\xae\x02\x90\x73\xe0\x2e\x97\x10\xfb\xa3\xf2\x36\x13\xf0\x4b\x28\x35\x26\x9a\x9b\x27\x4c\x1c\xbd\xc4\xa7\x74\x03\x0a\x33\x2e\x94\x78\xcc\xc8\x0a\xc6\x49\xb8\xd8\x3b\x5a\x38\x7e\x43\x71\x1f\x2d\x1c\x21\x03\x8e\x70\x9d\x92\x2f\xe2\xdf\x09\x98\xe3\xb2\xec\x1f\x77\x13\x6e\x08\xc2\x2c\xc0\x23\x48\x08\x57\xec\x11\x91\x26\x5c\xe6\x02\x73\x86\x7a\xe1\x48\xa1\x71\x84\x25\x88\x2d\x45\x79\xab\x2a\x9a\x95\xff\x36\x56\x52\xd6\x34\xd7\x73\x08\xff\xbe\xce\xb1\xcf\x39\x88\x7e\x95\xdf\xdb\xdd\xfd\xaf\x76\x29\xeb\x9d\x7e\xd9\x64\xbf\x7e\xbf\xe9\x13\xdb\x7a\x61\x13\x6a\x82\xb6\x9a\x51\x34\x4a\x08\x02\x74\x1f\x2d\xdd\x93\x50\x81\x2f\xbd\x91\x49\xeb\x02\xe2\xd5\xe3\x98\xe8\x2c\xc8\x9b\xcf\x81\x0f\x39\x8f\xe3\x5f\xdf\x0e\xc7\x93\x1a\xd8\x74\xa7\xb8\xe5\xcc\xd9\x99\x6a\x27\xaa\xe7\x5e\xbb\x26\xdb\xf1\xbe\x57\x41\x3a\x4d\xe9\x5a\x28\x3a\x67\x4f\xbb\x0e\x1a\x13\xae\x12\x0b\xb3\xcb\x74\x60\x34\xce\xba\xa0\x91\x6f\x62\x17\x78\x66\x81\x9f\x3e\xd9\x02\x3f\xb5\x0b\xdc\x2e\xf0\x6a\x34\xde\xd9\x05\xbe\xf7\x05\x7e\xf6\x64\x0b\xfc\xec\xf9\x16\x78\x80\x42\xc4\x64\x0e\x82\xfd\xd7\x7f\x8e\xde\xc9\xa7\xe2\x58\x8b\x8c\xc2\x9a\xc7\x79\xca\xa1\x55\x30\x24\xf1\xeb\x14\x0c\x67\x2e\x45\x9e\x86\xa6\x2f\x84\xdd\x4f\x1f\x88\x60\x65\xda\x26\x86\xd5\x35\x8b\xc7\x1e\xa7\x46\x67\x5d\x27\x6c\x3c\x45\xbb\x24\xc2\x7e\xf4\x57\xb9\x30\x54\x66\xe9\x5b\xa5\x01\x8b\xaa\xac\x44\x2c\xfe\xc6\x79\x3e\x05\x3f\x0b\xde\xeb\x3d\xb4\xee\xda\x9f\x32\x9a\x6b\xca\x1a\x99\x29\xd0\xa9\x56\x1e\xea\x4d\x2b\xa2\xfc\x0c\xc4\x8d\x1a\x35\xe1\xd1\xbe\x36\xb0\xda\x71\xf5\x40\xd6\xa9\xee\xd3\x40\x2b\xe8\x4d\x77\x57\xff\x4d\x66\xd9\xa7\x79\x68\x88\xd5\x1e\xcc\x47\xfd\x4c\xfb\x0e\x10\x9b\xe0\xd6\xc4\xfc\x74\x84\xbc\x79\x80\xd9\x08\xd0\x66\x52\xf8\xf4\x43\xe4\x56\xd7\xde\xf4\xcc\x3e\x6c\x41\x3f\xb5\x46\x67\xdf\xb7\x29\xda\x87\x88\x70\x77\xc4\x39\xdf\xd4\x6a\xca\x5d\x66\xda\x77\xa4\xdd\x04\xb7\x27\xd2\x94\xd5\x91\x7a\x23\x40\xad\xa6\xb4\x9a\xb2\x21\xda\x87\x48\x15\xec\x88\x73\xbe\xa9\xd5\x94\xbb\xcc\xb4\xef\x94\x45\x13\xdc\x9e\x48\x53\x56\xa7\x3c\x1a\x01\x7a\x14\x9a\x32\xf3\x05\x12\x32\x05\x18\x05\x86\x30\x3b\xdd\x6d\x33\x65\x4f\x7c\x48\x3d\x88\x7d\x84\x17\xc7\x9f\x42\x49\x69\xd7\xdd\x24\x3c\x6d\x1a\xa5\xc9\xa7\x44\x16\x2e\x15\xe3\xa6\x62\x83\xff\x75\x65\x5b\xac\x6d\xb7\xb6\xdd\xda\x76\xf3\x4c\xd6\xb6\x57\x01\x7a\x14\xb6\xdd\x6a\xca\x0a\x4a\x35\xc2\xda\xe6\x8b\xac\xa6\xac\x9d\xc9\xe6\x8b\xaa\x00\xb5\x9a\xd2\x6a\xca\x86\x68\xf7\x10\xe7\x7c\x53\xab\x29\x77\x99\xc9\xee\x41\x56\x01\x7a\x14\x9a\x72\x3f\xf9\x22\xca\x5c\xc2\x10\x5e\x00\x77\xce\x20\x39\xfe\x9c\xd1\x8b\x38\x76\x73\x17\x33\xe5\x82\xf3\x64\x0a\x7e\x6e\x68\x12\x77\xc5\xfd\x89\xcd\x61\xe9\x3a\xd9\xd9\xbc\xf5\x09\x91\xee\x76\x6a\x5f\xf6\x67\x77\xbb\xb2\x3f\x7b\x51\x67\x07\x3a\xeb\xf7\x0a\xa5\x5b\xc9\x9e\x16\x5a\xf6\x28\x53\xaf\x56\x27\x34\x46\x64\x7f\xe9\x81\x57\xaa\x10\x3a\x44\xda\x7b\xd0\x07\xe6\xc8\xf8\x50\xfa\xc0\x2e\xbc\xbe\x2c\x3c\xd3\x0e\xc6\x2b\x5d\x78\x5d\x76\x03\xf6\xb0\xf2\xcc\xd9\xfb\x27\xb0\xc4\x7b\x8b\x77\xc0\x4b\xda\x2e\xb7\xa1\x8f\xd5\xb6\x87\x44\xc4\x2a\xdc\xd7\xa5\x70\x5f\xf6\x99\x14\xab\x31\x1a\x23\x62\x03\xa3\x43\xaa\x0b\x1b\x19\xd9\x95\x77\xf8\x7d\x38\xbb\xf2\x5e\x45\x8e\x72\x2f\x91\x11\x3b\xfe\x58\x28\x25\xde\x2b\x38\x3a\xdc\xb4\x2b\x9a\x83\x05\x2b\xbb\xa8\xef\xb4\xcb\xa8\x2a\x5a\x63\x53\xf0\xb3\x3f\xcb\xdc\xfc\x79\x81\xfd\xff\x89\x50\xd9\xd5\x7f\xe6\xe3\x1c\xf5\x38\xec\xa8\x70\x9b\x4f\x75\x38\xde\x3f\xd9\x81\xb2\xfc\xa7\xab\xc4\x95\xea\xc2\x4d\x72\x53\x6d\x86\x15\xf1\x1d\x95\x06\x86\xbc\x6d\xb7\xc4\x74\xe9\xca\x11\xfc\xd0\xd4\x36\x52\xf9\xd8\x43\x9e\x14\x35\x7b\x64\xaa\x27\x47\xa6\xec\xe1\xd2\x97\x7b\x64\xca\x1e\x2e\xed\xc1\x10\xf6\x70\x69\x53\x4a\x35\xc2\xda\xbe\xb0\x64\x35\x65\xed\x4c\xf6\x85\xa5\x2a\x40\x8f\x42\x53\xb6\x4f\x29\x74\x58\x35\xc6\x34\xc4\x1c\x05\x0c\x12\xbb\x21\xdb\x97\x0d\xd9\x4f\x82\x1f\x62\x02\x11\x90\xc8\x28\xdf\x50\x1a\x4b\x27\x86\xde\xa9\x48\x13\xf0\x93\x64\xf2\x45\xac\xf8\xe2\x80\xb1\x46\x6c\x78\xf0\x08\x40\x8e\x44\xad\xa1\x01\x45\x53\x9f\xb9\xe4\x6d\x6a\x1a\x32\xcb\x08\x0d\x78\x93\x49\x52\xc3\xa5\x34\x43\xc9\x95\xe3\x9b\xed\x46\x68\x93\xcc\x10\x6f\x87\x85\x51\x72\x0f\x72\x5f\x25\x3e\x1f\x1f\x97\x04\x52\x8a\x22\x3c\x05\xc3\x7f\xdf\x6c\x56\xcb\x25\xd7\xe6\xe9\xd0\xdb\x2d\x38\x07\xd3\xcd\x26\xf3\xe8\xcf\xef\x1c\xaa\x7c\x7e\xd2\xde\xf3\xa7\x3d\xb5\xf7\xfc\x01\xeb\x06\xd9\x77\x6c\xec\x3b\x36\x1d\xdd\xa0\x42\xe5\xb3\x79\x44\xc0\x9f\x13\xe1\xe4\x70\x01\x97\xf2\x2e\x2f\xce\x4d\xf4\x95\xac\x6a\xc8\x9f\x39\x89\x2f\x24\x3b\x38\x64\x85\xc7\x6a\xac\x6d\xae\xbe\xee\xa6\x79\x55\xd8\x93\x13\x70\xff\x00\x01\xe5\x5f\xe5\xdc\x2e\x81\x71\x09\x99\x15\x81\x3e\xf0\xd1\x7c\x0e\x09\xc4\x2c\x58\x03\x2f\x0a\x97\x2e\x7f\xc8\x22\x10\xb1\x07\x48\xe2\x2e\x08\x83\x19\xf4\xdc\x15\x85\x00\x31\x18\xd2\xb8\x38\x06\xf4\xc1\x6c\x2d\x86\xa6\x7c\x1e\x3e\x30\x8e\x58\xfa\x23\xc2\xc0\xc5\x6b\xb0\x74\x09\x43\xde\x2a\x70\x09\x88\x88\x0f\xc9\x04\xd0\x08\xfc\x80\xc0\x73\xf1\x7f\x30\x40\x51\xb8\x0c\xd6\xc0\x87\x5e\xc0\x07\xf8\xf1\xe0\x32\xc0\x1e\x20\x80\x8f\x4b\xe8\x31\xe8\x03\x97\x10\x77\x4d\x41\x34\x8f\xe7\x76\x09\x74\x64\xf9\x8f\x92\x82\xb6\x2f\xb7\xda\x47\x9f\x8b\xfd\xed\xfd\x3e\xf8\x3e\x13\xe2\xcc\x12\xa2\x98\x9e\x31\x10\x62\x90\x2a\xb9\xe4\x82\xef\xaa\x8a\x99\x6a\xcd\x57\x96\x77\xea\xe2\x10\xee\x87\x86\x4f\xb7\xba\xda\x58\xab\x17\x45\x84\x16\xc7\xc7\x5e\x2e\x11\x5a\x1c\xb9\x4d\x7d\x91\xf8\x7f\xd7\x63\x2b\x37\xa8\x2f\x90\x06\x80\x2a\x23\xe6\x3b\x66\x4b\x2a\x94\x93\x3f\x33\xff\x2a\x13\x1f\xdb\x49\xb3\x1a\x6b\xc5\x9a\x6a\x1a\xac\xaa\x86\x9a\xfc\x9e\xd6\x4b\x03\x85\xe2\x67\x02\xd3\xe4\xc7\xef\x2e\xe1\x28\xdc\x31\x92\xd6\xbf\x03\xc0\x5c\xc9\x2c\x46\x97\xb7\x3d\x07\x5a\x29\xb3\x1c\xf5\xd2\x72\x97\xf2\xf7\xa4\xa8\xa5\xec\x9a\xb4\x3e\x39\x01\xbf\x27\xfe\x0b\x77\x8a\x44\x65\x33\xf0\x00\x09\x54\x7e\x92\xf0\xbf\xfc\x08\x52\xde\x26\xc6\x41\xfa\x2f\xb1\x57\x44\x97\xd0\x43\x73\xe4\x49\x9f\xc8\xc9\xcd\xff\x31\x80\x21\xc4\x8c\xfe\xea\x32\xef\x41\x40\x11\xab\xc6\x49\x4c\xb4\xd8\x39\xcc\xaa\xd8\xfc\x5b\xdd\x55\xba\xf6\xe4\x44\xc2\xc8\xbd\x54\xf8\x1d\x92\x35\x7b\xe0\x2d\x12\x29\x0a\x82\x6b\x01\xed\x71\xc8\x51\x02\x6d\x2a\x49\xf1\x93\x3e\xcb\x52\xdc\x6c\x8e\x08\x65\x1c\x58\x4e\xc2\x04\xee\x7f\xbe\xfd\x63\x50\xc9\xa8\xf8\x45\x16\xee\x29\x8b\x01\x84\x70\x25\xdc\xe3\x2e\xb9\x2c\x9c\xc9\xb9\x52\x49\x78\x85\x50\x87\x37\x30\x2a\x13\x9d\x35\x85\xe9\x92\x11\x6a\xf3\x25\x8a\x3c\x35\xf5\x85\x27\x39\xc0\x0a\xba\xb2\x7b\x66\xe3\xe4\x04\x84\x2b\xca\xe2\x25\xbb\x06\x38\xc2\x6f\x60\xb8\x64\xeb\x58\x54\xc0\x77\x99\x63\xe4\x1c\x52\x60\xd1\xfc\x10\x08\x03\x9a\xcc\x28\x73\x9f\x90\x4e\x00\x45\xd8\x83\xc0\x17\xb9\x25\x7f\xa6\x34\x06\x5d\x2d\x97\x11\x61\xf9\x31\xf4\x59\xe9\xb4\x2a\xeb\xdc\x29\xa5\xb2\x5b\x9a\xa4\x43\xea\xa3\x98\xf9\xa8\xca\x66\x34\xc8\x50\x14\x12\x14\x25\x66\xb3\x54\x42\x72\x0f\x77\x36\xaf\x35\x5a\x51\xad\xd4\xe7\xb4\xa3\x87\xd7\x71\xba\x63\xaf\x54\xdc\xe9\xf4\x8f\xbc\xd5\x4b\x2a\x84\x36\xb2\x76\x22\x6b\x5d\x6d\xe4\x72\xc5\x8b\x4e\xc7\x06\x9d\xfa\x7f\x7c\x69\xef\x4f\x8f\x1a\x73\xea\x87\x72\xce\x7a\x21\x3e\xcf\x67\x3a\x93\x66\x7f\x83\x98\x37\x49\xe0\x3e\x55\xe2\x52\x4c\x9d\xc5\x99\x23\x53\x2c\x4e\x9f\x23\x71\x14\xaa\xb8\xe3\x38\x13\x00\x55\x29\x21\x53\x1e\x84\x56\xe5\x41\xc6\xc5\xfa\xf3\xb1\x49\xc2\x11\x2b\xa4\x3b\x7f\xfb\x0e\xc9\x0f\x82\xb4\x3d\xd4\x62\x45\x7a\x73\x31\xfa\x8b\x80\x40\xd7\x5f\x7f\x7c\x44\x94\x51\xee\x7b\x76\x81\x4a\x61\xba\x55\xf5\x88\x2f\x61\x00\x99\x15\xac\xde\x0a\x56\xa1\x4b\x09\xc3\x44\xa7\x4e\xde\xed\x66\x93\x7a\x4f\xf7\x91\x68\x23\x90\xae\x40\x74\x18\x3a\x43\x8e\x6b\x82\xe4\x9b\xed\x76\x9c\x68\xae\xc1\x66\x93\xc0\xb0\xa0\x48\xcc\x6c\xd8\x90\xbc\x0a\xa2\x99\x1b\x28\x3f\xef\x5a\xfa\x96\x20\xa9\xd0\xef\x45\xe1\x72\xc5\xa0\x7f\xad\x36\x67\x93\xcd\x77\xf1\x85\x8f\x9c\xdd\xd3\xe4\xf4\x58\xca\xbd\x84\x0b\xec\xab\x71\x55\x1b\x11\x15\xae\x30\x8a\xb0\xf6\xa8\x7a\xa7\xb4\x72\x12\xf5\xfc\x77\xc4\x1e\xa2\x15\x53\x33\x0a\xfb\x17\xef\x4f\x78\x70\xa7\xc9\xde\x88\xa7\x26\xa6\xb5\xd8\x0c\x36\x8f\xcb\xe9\x1b\x51\xc4\xe0\x05\xf6\x6f\xbe\xfd\x9d\xd3\x45\x11\x48\xff\x35\x19\x5f\xf3\xc0\xcd\x72\x94\x0c\x8c\x23\xac\x48\x71\x2b\x45\xd7\xd7\x0e\x8e\x64\x88\x63\x06\xa3\x04\xe7\x64\x82\xe5\xb7\xec\xf3\x6a\xfa\x97\x49\x7d\x19\x61\xe3\x59\xd0\x5c\x0a\xdb\x67\x97\x26\xef\x9f\x94\x51\x32\x3e\x1c\xa3\x1d\x0e\xc9\xb6\x7b\x9b\x6f\x99\xa5\x86\x99\x8d\x5f\xe0\x9a\x5b\x83\x0a\x46\x0e\x3f\x5f\xdc\x7d\x1e\xaa\xb1\x93\xc3\x8e\xa5\x60\x9c\x16\x9a\xee\x09\x8e\xdb\x8b\xaf\x57\x1f\x53\x40\xcc\x6f\xec\x4c\xcf\x65\x0c\x6b\x3e\x93\xc9\xf8\x14\xe5\x07\x34\x8a\xba\x20\x3e\xc2\x14\x6f\x09\x0a\xe3\xc2\x4d\x0b\x50\x96\xe5\x83\xfc\x7f\x10\x9f\x8d\xaa\x3e\x1a\x55\x3a\xfe\xa0\x13\x68\xf2\x0c\x89\x0e\x5b\xf9\x19\x92\x72\x97\x7a\x20\x9d\x69\xe9\x7a\x46\xa4\x1b\x28\xf7\x90\x66\x00\x49\xf6\x6b\x53\x9f\xd7\x97\xc6\x4a\xb7\xf5\x8a\x68\x5d\x58\x32\x48\x4e\xdc\x74\x22\x9a\x72\x4a\x46\x8b\x0e\x98\x8e\x01\x59\x61\x83\xdf\x51\x41\xfe\xda\xa0\x66\x2e\xd4\x62\xa3\x38\x25\xff\xb4\x18\xb7\x54\x00\xa2\xe2\x98\xf2\x36\x69\x6c\x83\xe6\xe6\x09\x37\x83\x4c\xdc\x33\x77\x03\x0a\x33\xce\x87\x1e\x0e\x25\x12\x36\x3d\x07\x0b\xc7\x6f\xb9\x3c\x46\x0b\x47\xc8\x88\x23\xbc\x8e\xe4\x0b\x8a\xa3\x3a\x71\x0a\xc0\x14\x49\xcd\x43\xe6\xdc\x10\x84\x59\x80\x47\x5a\x20\x35\x8e\xc1\x29\x84\xd4\x0b\x47\x0a\x93\x93\x04\x52\xe3\xca\x56\x55\xb4\x2b\xff\x6d\xac\xa4\xae\x25\x0d\x8e\x7c\xd3\xbe\xde\x9d\x7e\xf6\xda\xe5\x15\x89\xb0\x83\x54\x2a\x3f\x18\xc4\x8d\xa1\xaf\x71\x9f\x9e\x95\xfc\xaf\xb2\x7c\xfe\x71\x88\x60\xc5\xd9\x8e\xe3\x13\xc1\x9a\xf3\x19\x56\x04\x7b\x29\x82\x15\x5c\x3b\x3e\x11\x6c\x70\x56\x2a\x97\xa6\x7f\x27\x9f\xca\xb3\x87\xc2\xad\x6c\xef\xc0\xaa\x14\x97\xa2\x9a\xf6\xb2\x49\x7c\x14\x49\xfd\xd4\xfe\x45\x93\x52\xa7\xfd\x20\x2f\x9c\x34\x9a\xed\x85\xbc\x78\xb2\xf7\x77\x12\xca\x43\xa4\xbe\xbe\x9b\xd0\xbb\x97\x4c\x8f\xf3\xd5\xd1\x0e\x98\x34\xc6\xaa\xa9\x56\xed\x13\xbb\x5e\xcd\x3b\xd1\xc7\x29\xae\xad\x2e\xce\x6b\x89\x55\x6f\xc4\xb5\xcb\xc9\x46\xf9\xb1\xe2\xda\x2f\x71\x6d\x75\x2d\x6c\x4b\xac\x7a\x23\xae\x5d\x4f\x23\xf7\xaa\xa8\xf3\x0b\xf4\x55\x8f\xe6\x8e\xb6\x43\x5c\xa5\x6b\x1d\x5a\xab\x72\x9b\x62\xd2\x18\xab\xa3\x57\xb9\x56\x5c\xfb\x26\xae\xd6\xa1\xb5\xe2\xda\x1a\x17\x9b\x2e\xe8\x0b\xbb\xfa\x5d\x75\xf2\x05\x3a\xb5\x3d\x49\xc0\x3e\x53\x29\x96\x3e\x88\x7c\x23\x5c\xac\x86\xea\x0b\xbb\xf6\x52\xb1\xd1\x46\x53\xaf\x74\x35\x59\xf7\xd4\xba\xa7\xad\x71\xb1\xc1\xff\x41\xd9\xf5\xbc\xf9\xd6\xc3\x14\x09\xb4\x9e\xaa\xf5\x54\xad\xb2\xb2\xca\x4a\xfb\xd8\x5d\x01\xbb\xd6\xac\x1f\x6b\xfd\xd8\xd7\x28\xae\x36\x89\xf1\x84\x7e\xec\x6e\x25\xdd\x5e\xa0\xe7\x7a\x34\x07\x07\x9a\x76\xb5\xc5\xdd\x5a\x4c\x65\x8b\xbb\xa9\xd9\x6c\x71\xb7\x02\xfd\xac\xbb\xdd\x0b\x83\xd8\x08\x17\xeb\x6e\x1f\x94\x5d\xd6\xdd\x7e\x29\xe2\x6a\x33\x31\xfb\x73\xb7\xe5\x48\x07\xb8\xd6\x3f\x36\xc6\xcd\xef\x40\x29\x7b\xc5\xbe\xe2\x0d\x7b\x7b\x09\x55\x4f\x2e\xa1\x0a\xcf\x26\xc9\x65\x11\xd4\x14\x0e\x55\xf0\x30\xbe\x97\x2a\x21\xd7\x37\xf1\x76\x64\xe1\x2e\x9d\xfc\x4d\xa9\xdf\xa8\x73\x91\xa3\xc7\x84\x93\x43\xe0\x62\x7c\x07\x38\xbe\x1d\x62\x2f\xcc\x51\xfe\xe4\x55\x24\xae\xbf\x99\x9e\x83\x85\xf8\xab\x21\x0b\x0c\x4a\x2a\x8e\x7b\xe0\x5f\x99\x81\x87\x94\x91\x79\xc8\x9c\x4b\x97\xc1\x7b\x14\xc2\x21\xc8\xdd\x0a\xa7\x2e\xb9\xa8\xbb\x4a\xd6\x89\x6f\x2a\x1d\x4f\x40\x78\xd6\xb4\x6d\xc9\x25\x71\x9a\x9f\xdd\x1a\x8e\x06\xd3\x8f\x07\x06\xd1\xd4\xbe\x8a\xef\x7f\x4e\xe2\xab\x48\xbb\xca\x5b\xa3\x95\x13\x2b\xae\x9c\xac\x9d\x15\x65\x2c\x62\x79\x31\x2b\xde\xdb\x27\x2e\x29\x31\x5f\xde\x57\x0e\xef\xd7\x88\x7d\xe2\xca\x67\x63\xbc\xf9\x71\xa3\xdd\x45\x25\xee\x0f\xa4\x77\x9e\x8b\x69\xe1\x3e\x26\x7d\xc4\xd7\x57\x3e\xe5\xe5\xde\xd1\x52\xe9\xca\x94\x5f\x61\x76\x60\xd7\xa5\xf2\x72\x82\x7e\xbf\xd8\xdf\x9b\x6a\x30\xcf\xc7\xbd\xca\xbb\x42\xfa\xcd\xbd\xde\x94\xb0\x79\x3e\xee\x55\x5e\xb3\xd1\x6f\xee\xbd\x84\xba\x3b\xb5\x8c\x4f\x07\xe9\x43\x98\x7f\x1c\xa1\xf0\xb3\x16\x11\x7a\x7e\x8e\xb6\xca\xce\x1d\x07\x47\x9f\xb5\x22\xd2\xf3\x73\xb4\x55\x02\xeb\x38\x38\xba\x4b\x79\xa7\x93\x13\xf0\x21\xc2\x14\x51\x06\x31\x8f\x15\x5c\x5f\xd6\x26\x99\x41\xe0\x23\xea\xce\x02\xe8\x83\x1f\x0f\x10\x8b\xb8\x42\xec\x01\x83\xab\xbb\xeb\x56\x05\x0d\xea\xb6\x63\x2f\xe5\x3c\x29\x18\xb7\xd0\xf5\xe5\x41\xa6\x04\xca\xfd\xd5\x39\xa8\x8b\x4e\x5f\x6b\x05\x04\x25\x0d\xb6\x10\x95\x26\x4b\xc7\xb1\x3a\x7a\x21\xf1\xb6\x64\x56\x49\xa9\x97\xee\xac\x57\x98\x56\xc8\x40\xaa\xf7\xf7\x5d\x70\xab\x99\xa5\x7e\xea\x8a\x5b\x15\x15\x14\xb2\x80\x16\xee\x9e\x7f\x36\xc0\x0f\x57\xf3\xe9\x28\x8c\x99\xad\x06\x65\xab\x41\x1d\x97\x2f\x94\x6b\xd6\xa2\x1a\x94\xda\x06\x93\xdb\x03\xb1\xb2\x62\xc4\xc5\xd4\xf5\x18\x57\x49\x72\x57\x4d\x69\xad\xb4\xee\xc8\x47\xcc\x55\xfc\x7d\xdc\x14\x45\x38\x2d\xb8\xa2\xf7\xff\x55\x51\x7d\x7a\xae\xeb\xa4\x92\x39\x4c\x43\xc4\x41\x84\xcc\x92\xcf\xd1\xe2\x53\x44\xb4\x1e\x29\x48\xb4\x6a\x54\x91\xf1\x4f\xa0\x35\xe5\xf1\x2e\xb0\xcf\x1f\x99\x61\x7f\xb6\xfd\xe3\xd3\x97\xbe\x81\x1c\x9e\xe5\x30\x2c\x63\x40\x67\x6c\x0d\xa2\xb4\x2f\xb4\x0d\x43\xef\xbc\x81\xbe\x8b\x8c\xca\x54\xf4\xe9\x44\x1c\xe3\x10\x1b\xed\x18\x05\xe3\xea\x85\xff\xaf\x00\x00\x00\xff\xff\x0f\x52\x20\x0f\xa9\xfb\x00\x00") +var _testsGoTmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x3d\x5b\x6f\xdb\xb8\x9a\xef\xfe\x15\x5c\xef\x60\xd6\x1e\xb8\x4a\x93\x2e\x16\x58\x03\x79\x48\x9b\x36\xcd\xf6\x4c\x27\x48\x72\xce\x2c\x70\x30\x18\xc8\x12\xed\x70\x2b\x51\x1e\x92\x6e\xe3\x35\xfc\xdf\x0f\x48\x4a\x14\x25\x51\x57\xdb\x89\x9c\xd0\x0f\x6d\x2c\xf3\xf2\xdd\xf8\xdd\x48\xf1\x5b\xba\xde\x37\x77\x01\x01\x83\x94\xd1\xc1\x00\x85\xcb\x88\x30\x30\x1a\x00\x30\xf4\x22\xcc\xe0\x23\x1b\xf2\xbf\xf9\xcf\x08\x2f\xc4\xdf\xf3\x50\x3c\xdb\x6c\xde\x00\x34\x07\x2e\x5e\xdf\xbb\xb3\x00\xfe\x9d\x42\x7a\xe9\x32\x78\x8f\x42\x08\x9c\xff\xbd\x7c\xff\x21\xc2\x73\xb4\xa0\x60\xbb\x1d\x00\xc0\x87\x40\x21\x4c\xfa\x41\xec\xf3\xe7\x7c\xb4\xcd\x06\x38\xbf\x46\xfe\x2a\x80\x5f\xdd\x10\x82\xed\x76\xb3\x71\xae\xa2\xdf\x56\x6c\xb9\x62\x37\x2e\x7b\xd8\x6e\x4f\xc2\xc8\x87\x01\xdd\x6c\x9c\x7f\x40\x42\x51\x84\xef\x56\xf3\x39\x7a\xdc\x6e\x87\x49\xff\x1b\x89\x44\x3c\xc0\x09\x7f\x94\x0e\x00\xe2\x86\x0b\xc4\x1e\x56\x33\xc7\x8b\xc2\x13\xca\x08\x64\xde\x03\x39\x11\x68\xcd\xd7\x27\x04\xfe\xb5\x42\x04\xb6\x46\x4b\x1f\x74\x11\xbd\x89\x96\x10\xbb\x4b\xc4\xc7\x8f\x89\x24\x3f\x1a\xca\xe3\xc1\x60\xb3\x69\x3a\xc1\x7c\x85\x3d\x10\xae\x28\xe3\x3f\x8e\x28\xa0\x8c\x20\xbc\x18\x03\x39\xbe\xa3\xba\x6d\x06\x00\xb0\x09\x80\x84\x80\xe9\x39\xe0\x84\x76\x6e\x5c\x42\xe1\x48\xfc\x79\xfb\xe9\xc3\xbb\x77\xef\xfe\x7b\x02\xe8\x78\x00\xf8\xd4\xbc\xdd\xbf\x9d\x03\x8c\x02\xd1\x13\x80\xa5\x8b\x91\x37\x82\x84\xf0\x06\x1c\x2f\x02\xd9\x8a\xe0\xfc\x3c\x23\x36\x1e\x6c\x07\x1a\x32\x66\x4c\x4a\xb1\xe0\x3f\x9a\xb1\xa8\xc1\x80\x37\xf9\x0d\x07\xeb\xdd\x50\x28\x80\x2f\x21\x5b\x46\x08\x33\x48\xee\xa3\x3b\x01\xd7\x88\x32\xa2\x40\xfc\x45\xfe\xb1\x49\xc7\xfb\x99\x32\x32\x48\xba\xde\xae\xf0\xe5\xfb\x7b\xbe\x72\x46\x0c\xfc\x12\xaf\x11\xe7\x7e\x02\xfc\xd9\x27\xd7\x63\x11\x59\x03\xde\x6e\x34\x06\xfe\xcc\xb9\xe6\xb3\xcc\x5d\x0f\x8e\x05\xc8\x1c\x8e\x9f\x1e\xfd\x59\x42\xa8\xe9\x79\x51\xbc\x78\x1b\xe2\xe2\x05\xd4\x5a\x96\x36\xfc\x49\x2c\x13\xb1\x06\xa6\xe7\x60\xe9\x52\xcf\x0d\xd0\xff\xeb\x5d\x9d\x3b\xef\x01\x86\x6e\xbc\x4c\x38\xc5\x9d\xdb\x15\x1e\x0d\xaf\x20\xdb\x6c\xf4\xfe\xdb\xed\x70\x02\x0c\x4f\x47\x0a\xaf\xd1\x78\x02\xd8\x78\x9c\x91\x70\x34\xd7\xe7\xba\x08\x82\xe8\xc7\x0d\x41\xa1\x4b\xd6\xd7\xd8\x87\x8f\x77\x9e\x8b\x33\xd3\xf2\x07\xf9\x19\xe8\x70\x02\x8c\xcf\xab\xa7\x8e\x19\xaa\xe0\x40\x7c\xc2\xcf\x2e\xbd\xe5\xc4\xfb\x02\xd7\x3a\x60\x97\x6b\xec\x86\xd1\xe5\x7b\xe7\x0b\x5c\x4b\x82\x68\x34\x14\x1d\x13\x1a\xa6\x5f\x1a\x74\x2f\xa7\x25\x7d\xbf\xe6\x8f\xd2\xd1\xca\xc8\x6b\x68\x68\x42\x3b\x83\x70\x42\x4b\xf7\x3b\x34\xf0\xd0\xf4\xd8\x34\x64\x3c\xca\x25\x0c\x20\x33\x8d\x63\xfe\xa1\x0c\xb8\x58\x64\x17\x14\x71\x2a\x9a\x68\x77\x15\x44\x33\x37\xb8\x83\x5e\x84\xfd\x44\x3e\xa0\x2e\xcb\x5e\x14\x2e\x57\x0c\xfa\xd7\x25\xfc\x58\x50\x64\xe2\x9f\x91\xf5\x86\xb6\xb5\xcc\x2a\xce\x5f\xc3\x34\x53\x87\x52\xe6\x05\xb4\x76\x01\xb6\x05\xa3\x03\x14\xa6\x35\x23\x56\x2d\xe5\x2b\x90\xea\x3a\x47\xd0\x50\x1f\xb4\x66\x15\x57\x42\xdf\xb2\x47\x23\xf8\x63\x91\x63\xc4\xc5\xd4\xf5\xd8\xef\x88\x3d\x68\xca\x2e\x2b\x85\x1f\x31\xb7\x56\xf7\x71\x53\x14\x61\x5d\xf0\xf4\x11\x7e\x2d\x51\xa8\x25\xb3\xe8\x54\x49\x46\x37\x2d\xc0\x0b\xec\xf3\x47\xe6\x99\x04\x85\x76\xe8\xdd\x88\x5a\xea\x4b\x41\x83\x6e\x85\x7b\xd2\xc0\xe6\x74\xb2\x38\x6a\x69\x47\x14\x31\x78\xc1\x18\x41\xb3\x15\x83\x37\x24\x5a\x42\xc2\x10\x14\x56\x70\x01\xd9\x87\x42\x93\x0b\xec\x17\x1f\x0a\x29\xd1\x3a\xa7\xf3\x26\x73\x2d\xbf\x09\xda\xa8\x1e\x1c\x10\x31\x49\x58\x7c\xfc\x29\x22\x62\xc0\x8c\xdc\xd7\xe9\x7d\x31\x0b\x8e\xf0\xcd\x17\xa5\xcc\xa4\x1b\x91\xc5\xa9\xa6\x85\x36\x63\xe2\x2f\x99\xac\x2f\xcd\xb8\x11\x13\xa0\xfb\x1c\x63\xe9\x69\x64\x1f\x69\x7e\x4b\xc9\xaf\xea\xe3\xb1\x47\x0e\x68\xec\xf3\x3b\xef\x5d\xef\xdb\x82\x44\x2b\xec\x8f\xa4\xa5\x0d\x15\xd5\xa8\x93\x07\x2c\x19\x48\x5b\x88\xae\x4e\xda\x12\x82\xe7\xd0\x4e\xa5\x51\x17\xa5\xec\x40\xdb\xed\x94\xff\x0e\x1f\xdd\x70\x19\xc0\x7f\xb8\xc1\x0a\x7e\x8a\x88\x1a\x36\xc3\xba\x6c\xcf\x53\xb0\xdd\x4e\x06\x06\x8f\x41\x7a\x8b\x9c\x4e\x22\x04\x70\xbe\xa2\x60\xc4\x26\x80\x3a\x46\xdb\xe9\xb1\xc7\x09\x08\x63\xef\x23\x3c\x53\x1e\x2b\x75\x4c\x0c\x13\xad\xd3\xf5\x54\x20\x4a\x89\x7c\xf2\x18\x08\xa8\xc6\xf7\x91\x68\x23\x90\xad\x40\x70\x18\x3a\x43\x8e\x23\x27\x8f\xc0\x6d\x6c\x42\x2b\x76\x90\xab\x79\x55\x0a\x96\xea\x29\xfa\x5c\x45\xf7\xeb\xa5\xe8\xb0\x10\x7f\x35\xe4\x84\xc6\xea\x9c\xf7\x08\xff\xca\x0c\x3c\xcc\x85\x1f\xc3\xa4\x6b\x82\xd3\xc7\xbf\x56\xae\xc0\x2a\x74\xaa\x85\xc6\x89\x5d\xfb\xf1\x04\x84\x67\x4d\xdb\x8e\x8d\x60\xa6\xb6\xdb\x00\xc7\x0e\x6c\xeb\xd6\xf7\x4c\x74\x4e\x39\xaa\x49\x75\x36\xcc\x06\xe0\x4f\x29\xab\x55\xa2\xda\x60\x19\x97\x88\xc6\x1b\xc5\x54\x31\xad\xb6\x3c\xbf\x46\xec\x86\x91\x86\xa2\x71\xc6\x07\xca\xaf\xd2\x37\x06\x81\x29\xf2\x46\xc9\x79\xc4\xf2\xa2\x9e\xfc\x74\x4d\xb9\x58\xc5\x3f\xf1\x18\xcd\xf9\x48\x48\x9e\x10\x5f\x23\xf6\x89\xab\xbd\xcd\x56\x06\x92\xc2\x20\x76\x8c\x29\x76\x8a\x28\x44\xe7\x07\x97\x3e\xf0\xa9\x92\xae\x35\xdd\xde\xe6\x3b\x2a\xa2\x57\x18\xbd\x2f\x70\x2d\x96\x5b\x63\xb3\x37\xfc\x7c\x71\xf7\x79\xa8\xa6\x22\x09\x3d\x1a\x02\x79\x5a\xe8\x79\x18\x28\x6f\x2f\xbe\x5e\x7d\x4c\xc1\x0c\x20\xbe\x35\xce\x17\x40\x6c\x04\x65\xbb\x1d\x30\x3e\xe3\xa2\x51\xa0\x76\x8d\x97\x2b\x06\x28\x23\x2b\x8f\x09\xcb\xca\x0d\x2a\x50\xf6\xf4\x83\xfc\x7f\x00\x00\x12\x0d\xfd\x99\x69\x15\x96\x8d\x3b\x68\x05\x8a\x4c\x7d\xe9\xb0\x6c\x36\xc0\x73\x43\x28\x15\x5e\xa6\x37\xf8\xe7\x1f\x25\x46\x7d\x00\x84\xbe\x00\xe2\xbf\x88\xb4\x03\xe1\x1e\xd2\x0c\x00\xdc\xeb\x10\x3f\xc9\x7c\xca\x00\x00\x5f\x2e\x5b\xdd\xa1\x51\xc4\x69\x43\xf2\x01\x00\x91\xc4\xb7\x0d\x71\x54\x06\x67\xb4\x68\x81\xd1\x18\x90\x15\x36\x38\x51\x15\xe4\x9d\x9e\x97\x53\x78\xc3\x69\x3c\xc7\xbc\x8d\xf0\xce\x42\xf0\x4b\x49\xcb\x09\x08\x5c\x5a\x80\x12\xcc\xa2\x28\x18\x8b\x7f\x63\x5f\xae\x02\x90\x73\xe0\x2e\x97\x10\xfb\xa3\xf2\x36\x13\xf0\x4b\x28\x35\x26\x9a\x9b\x27\x4c\x1c\xbd\xc4\xa7\x74\x03\x0a\x33\x2e\x94\x78\xcc\xc8\x0a\xc6\x49\xb8\xd8\x3b\x5a\x38\x7e\x43\x71\x1f\x2d\x1c\x21\x03\x8e\x70\x9d\x92\x2f\xe2\xdf\x09\x98\xe3\xb2\xec\x1f\x77\x13\x6e\x08\xc2\x2c\xc0\x23\x48\x08\x57\xec\x11\x91\x26\x5c\xe6\x02\x73\x86\x7a\xe1\x48\xa1\x71\x84\x25\x88\x2d\x45\x79\xab\x2a\x9a\x95\xff\x36\x56\x52\xd6\x34\xd7\x73\x08\xff\xbe\xce\xb1\xcf\x39\x88\x7e\x95\xdf\xdb\xdd\xfd\xaf\x76\x29\xeb\x9d\x7e\xd9\x64\xbf\x7e\xbf\xe9\x13\xdb\x7a\x61\x13\x6a\x82\xb6\x9a\x51\x34\x4a\x08\x02\x74\x1f\x2d\xdd\x93\x50\x81\x2f\xbd\x91\x49\xeb\x02\xe2\xd5\xe3\x98\xe8\x2c\xc8\x9b\xcf\x81\x0f\x39\x8f\xe3\x5f\xdf\x0e\xc7\x93\x1a\xd8\x74\xa7\xb8\xe5\xcc\xd9\x99\x6a\x27\xaa\xe7\x5e\xbb\x26\xdb\xf1\xbe\x57\x41\x3a\x4d\xe9\x5a\x28\x3a\x67\x4f\xbb\x0e\x1a\x13\xae\x12\x0b\xb3\xcb\x74\x60\x34\xce\xba\xa0\x91\x6f\x62\x17\x78\x66\x81\x9f\x3e\xd9\x02\x3f\xb5\x0b\xdc\x2e\xf0\x6a\x34\xde\xd9\x05\xbe\xf7\x05\x7e\xf6\x64\x0b\xfc\xec\xf9\x16\x78\x80\x42\xc4\x64\x0e\x82\xfd\xd7\x7f\x8e\xde\xc9\xa7\xe2\x58\x8b\x8c\xc2\x9a\xc7\x79\xca\xa1\x55\x30\x24\xf1\xeb\x14\x0c\x67\x2e\x45\x9e\x86\xa6\x2f\x84\xdd\x4f\x1f\x88\x60\x65\xda\x26\x86\xd5\x35\x8b\xc7\x1e\xa7\x46\x67\x5d\x27\x6c\x3c\x45\xbb\x24\xc2\x7e\xf4\x57\xb9\x30\x54\x66\xe9\x5b\xa5\x01\x8b\xaa\xac\x44\x2c\xfe\xc6\x79\x3e\x05\x3f\x0b\xde\xeb\x3d\xb4\xee\xda\x9f\x32\x9a\x6b\xca\x1a\x99\x29\xd0\xa9\x56\x1e\xea\x4d\x2b\xa2\xfc\x0c\xc4\x8d\x1a\x35\xe1\xd1\xbe\x36\xb0\xda\x71\xf5\x40\xd6\xa9\xee\xd3\x40\x2b\xe8\x4d\x77\x57\xff\x4d\x66\xd9\xa7\x79\x68\x88\xd5\x1e\xcc\x47\xfd\x4c\xfb\x0e\x10\x9b\xe0\xd6\xc4\xfc\x74\x84\xbc\x79\x80\xd9\x08\xd0\x66\x52\xf8\xf4\x43\xe4\x56\xd7\xde\xf4\xcc\x3e\x6c\x41\x3f\xb5\x46\x67\xdf\xb7\x29\xda\x87\x88\x70\x77\xc4\x39\xdf\xd4\x6a\xca\x5d\x66\xda\x77\xa4\xdd\x04\xb7\x27\xd2\x94\xd5\x91\x7a\x23\x40\xad\xa6\xb4\x9a\xb2\x21\xda\x87\x48\x15\xec\x88\x73\xbe\xa9\xd5\x94\xbb\xcc\xb4\xef\x94\x45\x13\xdc\x9e\x48\x53\x56\xa7\x3c\x1a\x01\x7a\x14\x9a\x32\xf3\x05\x12\x32\x05\x18\x05\x86\x30\x3b\xdd\x6d\x33\x65\x4f\x7c\x48\x3d\x88\x7d\x84\x17\xc7\x9f\x42\x49\x69\xd7\xdd\x24\x3c\x6d\x1a\xa5\xc9\xa7\x44\x16\x2e\x15\xe3\xa6\x62\x83\xff\x75\x65\x5b\xac\x6d\xb7\xb6\xdd\xda\x76\xf3\x4c\xd6\xb6\x57\x01\x7a\x14\xb6\xdd\x6a\xca\x0a\x4a\x35\xc2\xda\xe6\x8b\xac\xa6\xac\x9d\xc9\xe6\x8b\xaa\x00\xb5\x9a\xd2\x6a\xca\x86\x68\xf7\x10\xe7\x7c\x53\xab\x29\x77\x99\xc9\xee\x41\x56\x01\x7a\x14\x9a\x72\x3f\xf9\x22\xca\x5c\xc2\x10\x5e\x00\x77\xce\x20\x39\xfe\x9c\xd1\x8b\x38\x76\x73\x17\x33\xe5\x82\xf3\x64\x0a\x7e\x6e\x68\x12\x77\xc5\xfd\x89\xcd\x61\xe9\x3a\xd9\xd9\xbc\xf5\x09\x91\xee\x76\x6a\x5f\xf6\x67\x77\xbb\xb2\x3f\x7b\x51\x67\x07\x3a\xeb\xf7\x0a\xa5\x5b\xc9\x9e\x16\x5a\xf6\x28\x53\xaf\x56\x27\x34\x46\x64\x7f\xe9\x81\x57\xaa\x10\x3a\x44\xda\x7b\xd0\x07\xe6\xc8\xf8\x50\xfa\xc0\x2e\xbc\xbe\x2c\x3c\xd3\x0e\xc6\x2b\x5d\x78\x5d\x76\x03\xf6\xb0\xf2\xcc\xd9\xfb\x27\xb0\xc4\x7b\x8b\x77\xc0\x4b\xda\x2e\xb7\xa1\x8f\xd5\xb6\x87\x44\xc4\x2a\xdc\xd7\xa5\x70\x5f\xf6\x99\x14\xab\x31\x1a\x23\x62\x03\xa3\x43\xaa\x0b\x1b\x19\xd9\x95\x77\xf8\x7d\x38\xbb\xf2\x5e\x45\x8e\x72\x2f\x91\x11\x3b\xfe\x58\x28\x25\xde\x2b\x38\x3a\xdc\xb4\x2b\x9a\x83\x05\x2b\xbb\xa8\xef\xb4\xcb\xa8\x2a\x5a\x63\x53\xf0\xb3\x3f\xcb\xdc\xfc\x79\x81\xfd\xff\x89\x50\xd9\xd5\x7f\xe6\xe3\x1c\xf5\x38\xec\xa8\x70\x9b\x4f\x75\x38\xde\x3f\xd9\x81\xb2\xfc\xa7\xab\xc4\x95\xea\xc2\x4d\x72\x53\x6d\x86\x15\xf1\x1d\x95\x06\x86\xbc\x6d\xb7\xc4\x74\xe9\xca\x11\xfc\xd0\xd4\x36\x52\xf9\xd8\x43\x9e\x14\x35\x7b\x64\xaa\x27\x47\xa6\xec\xe1\xd2\x97\x7b\x64\xca\x1e\x2e\xed\xc1\x10\xf6\x70\x69\x53\x4a\x35\xc2\xda\xbe\xb0\x64\x35\x65\xed\x4c\xf6\x85\xa5\x2a\x40\x8f\x42\x53\xb6\x4f\x29\x74\x58\x35\xc6\x34\xc4\x1c\x05\x0c\x12\xbb\x21\xdb\x97\x0d\xd9\x4f\x82\x1f\x62\x02\x11\x90\xc8\x28\xdf\x50\x1a\x4b\x27\x86\xde\xa9\x48\x13\xf0\x93\x64\xf2\x45\xac\xf8\xe2\x80\xb1\x46\x6c\x78\xf0\x08\x40\x8e\x44\xad\xa1\x01\x45\x53\x9f\xb9\xe4\x6d\x6a\x1a\x32\xcb\x08\x0d\x78\x93\x49\x52\xc3\xa5\x34\x43\xc9\x95\xe3\x9b\xed\x46\x68\x93\xcc\x10\x6f\x87\x85\x51\x72\x0f\x72\x5f\x25\x3e\x1f\x1f\x97\x04\x52\x8a\x22\x3c\x05\xc3\x7f\xdf\x6c\x56\xcb\x25\xd7\xe6\xe9\xd0\xdb\x2d\x38\x07\xd3\xcd\x26\xf3\xe8\xcf\xef\x1c\xaa\x7c\x7e\xd2\xde\xf3\xa7\x3d\xb5\xf7\xfc\x01\xeb\x06\xd9\x77\x6c\xec\x3b\x36\x1d\xdd\xa0\x42\xe5\xb3\x79\x44\xc0\x9f\x13\xe1\xe4\x70\x01\x97\xf2\x2e\x2f\xce\x4d\xf4\x95\xac\x6a\xc8\x9f\x39\x89\x2f\x24\x3b\x38\x64\x85\xc7\x6a\xac\x6d\xae\xbe\xee\xa6\x79\x55\xd8\x93\x13\x70\xff\x00\x01\xe5\x5f\xe5\xdc\x2e\x81\x71\x09\x99\x15\x81\x3e\xf0\xd1\x7c\x0e\x09\xc4\x2c\x58\x03\x2f\x0a\x97\x2e\x7f\xc8\x22\x10\xb1\x07\x48\xe2\x2e\x08\x83\x19\xf4\xdc\x15\x85\x00\x31\x18\xd2\xb8\x38\x06\xf4\xc1\x6c\x2d\x86\xa6\x7c\x1e\x3e\x30\x8e\x58\xfa\x23\xc2\xc0\xc5\x6b\xb0\x74\x09\x43\xde\x2a\x70\x09\x88\x88\x0f\xc9\x04\xd0\x08\xfc\x80\xc0\x73\xf1\x7f\x30\x40\x51\xb8\x0c\xd6\xc0\x87\x5e\xc0\x07\xf8\xf1\xe0\x32\xc0\x1e\x20\x80\x8f\x4b\xe8\x31\xe8\x03\x97\x10\x77\x4d\x41\x34\x8f\xe7\x76\x09\x74\x64\xf9\x8f\x92\x82\xb6\x2f\xb7\xda\x47\x9f\x8b\xfd\xed\xfd\x3e\xf8\x3e\x13\xe2\xcc\x12\xa2\x98\x9e\x31\x10\x62\x90\x2a\xb9\xe4\x82\xef\xaa\x8a\x99\x6a\xcd\x57\x96\x77\xea\xe2\x10\xee\x87\x86\x4f\xb7\xba\xda\x58\xab\x17\x45\x84\x16\xc7\xc7\x5e\x2e\x11\x5a\x1c\xb9\x4d\x7d\x91\xf8\x7f\xd7\x63\x2b\x37\xa8\x2f\x90\x06\x80\x2a\x23\xe6\x3b\x66\x4b\x2a\x94\x93\x3f\x33\xff\x2a\x13\x1f\xdb\x49\xb3\x1a\x6b\xc5\x9a\x6a\x1a\xac\xaa\x86\x9a\xfc\x9e\xd6\x4b\x03\x85\xe2\x67\x02\xd3\xe4\xc7\xef\x2e\xe1\x28\xdc\x31\x92\xd6\xbf\x03\xc0\x5c\xc9\x2c\x46\x97\xb7\x3d\x07\x5a\x29\xb3\x1c\xf5\xd2\x72\x97\xf2\xf7\xa4\xa8\xa5\xec\x9a\xb4\x3e\x39\x01\xbf\x27\xfe\x0b\x77\x8a\x44\x65\x33\xf0\x00\x09\x54\x7e\x92\xf0\xbf\xfc\x08\x52\xde\x26\xc6\x41\xfa\x2f\xb1\x57\x44\x97\xd0\x43\x73\xe4\x49\x9f\xc8\xc9\xcd\xff\x31\x80\x21\xc4\x8c\xfe\xea\x32\xef\x41\x40\x11\xab\xc6\x49\x4c\xb4\xd8\x39\xcc\xaa\xd8\xfc\x5b\xdd\x55\xba\xf6\xe4\x44\xc2\xc8\xbd\x54\xf8\x1d\x92\x35\x7b\xe0\x2d\x12\x29\x0a\x82\x6b\x01\xed\x71\xc8\x51\x02\x6d\x2a\x49\xf1\x93\x3e\xcb\x52\xdc\x6c\x8e\x08\x65\x1c\x58\x4e\xc2\x04\xee\x7f\xbe\xfd\x63\x50\xc9\xa8\xf8\x45\x16\xee\x29\x8b\x01\x84\x70\x25\xdc\xe3\x2e\xb9\x2c\x9c\xc9\xb9\x52\x49\x78\x85\x50\x87\x37\x30\x2a\x13\x9d\x35\x85\xe9\x92\x11\x6a\xf3\x25\x8a\x3c\x35\xf5\x85\x27\x39\xc0\x0a\xba\xb2\x7b\x66\xe3\xe4\x04\x84\x2b\xca\xe2\x25\xbb\x06\x38\xc2\x6f\x60\xb8\x64\xeb\x58\x54\xc0\x77\x99\x63\xe4\x1c\x52\x60\xd1\xfc\x10\x08\x03\x9a\xcc\x28\x73\x9f\x90\x4e\x00\x45\xd8\x83\xc0\x17\xb9\x25\x7f\xa6\x34\x06\x5d\x2d\x97\x11\x61\xf9\x31\xf4\x59\xe9\xb4\x2a\xeb\xdc\x29\xa5\xb2\x5b\x9a\xa4\x43\xea\xa3\x98\xf9\xa8\xca\x66\x34\xc8\x50\x14\x12\x14\x25\x66\xb3\x54\x42\x72\x0f\x77\x36\xaf\x35\x5a\x51\xad\xd4\xe7\xb4\xa3\x87\xd7\x71\xba\x63\xaf\x54\xdc\xe9\xf4\x8f\xbc\xd5\x4b\x2a\x84\x36\xb2\x76\x22\x6b\x5d\x6d\xe4\x72\xc5\x8b\x4e\xc7\x06\x9d\xfa\x7f\x7c\x69\xef\x4f\x8f\x1a\x73\xea\x87\x72\xce\x7a\x21\x3e\xcf\x67\x3a\x93\x66\x7f\x83\x98\x37\x49\xe0\x3e\x55\xe2\x52\x4c\x9d\xc5\x99\x23\x53\x2c\x4e\x9f\x23\x71\x14\xaa\xb8\xe3\x38\x13\x00\x55\x29\x21\x53\x1e\x84\x56\xe5\x41\xc6\xc5\xfa\xf3\xb1\x49\xc2\x11\x2b\xa4\x3b\x7f\xfb\x0e\xc9\x0f\x82\xb4\x3d\xd4\x62\x45\x7a\x73\x31\xfa\x8b\x80\x40\xd7\x5f\x7f\x7c\x44\x94\x51\xee\x7b\x76\x81\x4a\x61\xba\x55\xf5\x88\x2f\x61\x00\x99\x15\xac\xde\x0a\x56\xa1\x4b\x09\xc3\x44\xa7\x4e\xde\xed\x66\x93\x7a\x4f\xf7\x91\x68\x23\x90\xae\x40\x74\x18\x3a\x43\x8e\x6b\x82\xe4\x9b\xed\x76\x9c\x68\xae\xc1\x66\x93\xc0\xb0\xa0\x48\xcc\x6c\xd8\x90\xbc\x0a\xa2\x99\x1b\x28\x3f\xef\x5a\xfa\x96\x20\xa9\xd0\xef\x45\xe1\x72\xc5\xa0\x7f\xad\x36\x67\x93\xcd\x77\xf1\x85\x8f\x9c\xdd\xd3\xe4\xf4\x58\xca\xbd\x84\x0b\xec\xab\x71\x55\x1b\x11\x15\xae\x30\x8a\xb0\xf6\xa8\x7a\xa7\xb4\x72\x12\xf5\xfc\x77\xc4\x1e\xa2\x15\x53\x33\x0a\xfb\x17\xef\x4f\x78\x70\xa7\xc9\xde\x88\xa7\x26\xa6\xb5\xd8\x0c\x36\x8f\xcb\xe9\x1b\x51\xc4\xe0\x05\xf6\x6f\xbe\xfd\x9d\xd3\x45\x11\x48\xff\x35\x19\x5f\xf3\xc0\xcd\x72\x94\x0c\x8c\x23\xac\x48\x71\x2b\x45\xd7\xd7\x0e\x8e\x64\x88\x63\x06\xa3\x04\xe7\x64\x82\xe5\xb7\xec\xf3\x6a\xfa\x97\x49\x7d\x19\x61\xe3\x59\xd0\x5c\x0a\xdb\x67\x97\x26\xef\x9f\x94\x51\x32\x3e\x1c\xa3\x1d\x0e\xc9\xb6\x7b\x9b\x6f\x99\xa5\x86\x99\x8d\x5f\xe0\x9a\x5b\x83\x0a\x46\x0e\x3f\x5f\xdc\x7d\x1e\xaa\xb1\x93\xc3\x8e\xa5\x60\x9c\x16\x9a\xee\x09\x8e\xdb\x8b\xaf\x57\x1f\x53\x40\xcc\x6f\xec\x4c\xcf\x65\x0c\x6b\x3e\x93\xc9\xf8\x14\xe5\x07\x34\x8a\xba\x20\x3e\xc2\x14\x6f\x09\x0a\xe3\xc2\x4d\x0b\x50\x96\xe5\x83\xfc\x7f\x10\x9f\x8d\xaa\x3e\x1a\x55\x3a\xfe\xa0\x13\x68\xf2\x0c\x89\x0e\x5b\xf9\x19\x92\x72\x97\x7a\x20\x9d\x69\xe9\x7a\x46\xa4\x1b\x28\xf7\x90\x66\x00\x49\xf6\x6b\x53\x9f\xd7\x97\xc6\x4a\xb7\xf5\x8a\x68\x5d\x58\x32\x48\x4e\xdc\x74\x22\x9a\x72\x4a\x46\x8b\x0e\x98\x8e\x01\x59\x61\x83\xdf\x51\x41\xfe\xda\xa0\x66\x2e\xd4\x62\xa3\x38\x25\xff\xb4\x18\xb7\x54\x00\xa2\xe2\x98\xf2\x36\x69\x6c\x83\xe6\xe6\x09\x37\x83\x4c\xdc\x33\x77\x03\x0a\x33\xce\x87\x1e\x0e\x25\x12\x36\x3d\x07\x0b\xc7\x6f\xb9\x3c\x46\x0b\x47\xc8\x88\x23\xbc\x8e\xe4\x0b\x8a\xa3\x3a\x71\x0a\xc0\x14\x49\xcd\x43\xe6\xdc\x10\x84\x59\x80\x47\x5a\x20\x35\x8e\xc1\x29\x84\xd4\x0b\x47\x0a\x93\x93\x04\x52\xe3\xca\x56\x55\xb4\x2b\xff\x6d\xac\xa4\xae\x25\x0d\x8e\x7c\xd3\xbe\xde\x9d\x7e\xf6\xda\xe5\x15\x89\xb0\x83\x54\x2a\x3f\x18\xc4\x8d\xa1\xaf\x71\x9f\x9e\x95\xfc\xaf\xb2\x7c\xfe\x71\x88\x60\xc5\xd9\x8e\xe3\x13\xc1\x9a\xf3\x19\x56\x04\x7b\x29\x82\x15\x5c\x3b\x3e\x11\x6c\x70\x56\x2a\x97\xa6\x7f\x27\x9f\xca\xb3\x87\xc2\xad\x6c\xef\xc0\xaa\x14\x97\xa2\x9a\xf6\xb2\x49\x7c\x14\x49\xfd\xd4\xfe\x45\x93\x52\xa7\xfd\x20\x2f\x9c\x34\x9a\xed\x85\xbc\x78\xb2\xf7\x77\x12\xca\x43\xa4\xbe\xbe\x9b\xd0\xbb\x97\x4c\x8f\xf3\xd5\xd1\x0e\x98\x34\xc6\xaa\xa9\x56\xed\x13\xbb\x5e\xcd\x3b\xd1\xc7\x29\xae\xad\x2e\xce\x6b\x89\x55\x6f\xc4\xb5\xcb\xc9\x46\xf9\xb1\xe2\xda\x2f\x71\x6d\x75\x2d\x6c\x4b\xac\x7a\x23\xae\x5d\x4f\x23\xf7\xaa\xa8\xf3\x0b\xf4\x55\x8f\xe6\x8e\xb6\x43\x5c\xa5\x6b\x1d\x5a\xab\x72\x9b\x62\xd2\x18\xab\xa3\x57\xb9\x56\x5c\xfb\x26\xae\xd6\xa1\xb5\xe2\xda\x1a\x17\x9b\x2e\xe8\x0b\xbb\xfa\x5d\x75\xf2\x05\x3a\xb5\x3d\x49\xc0\x3e\x53\x29\x96\x3e\x88\x7c\x23\x5c\xac\x86\xea\x0b\xbb\xf6\x52\xb1\xd1\x46\x53\xaf\x74\x35\x59\xf7\xd4\xba\xa7\xad\x71\xb1\xc1\xff\x41\xd9\xf5\xbc\xf9\xd6\xc3\x14\x09\xb4\x9e\xaa\xf5\x54\xad\xb2\xb2\xca\x4a\xfb\xd8\x5d\x01\xbb\xd6\xac\x1f\x6b\xfd\xd8\xd7\x28\xae\x36\x89\xf1\x84\x7e\xec\x6e\x25\xdd\x5e\xa0\xe7\x7a\x34\x07\x07\x9a\x76\xb5\xc5\xdd\x5a\x4c\x65\x8b\xbb\xa9\xd9\x6c\x71\xb7\x02\xfd\xac\xbb\xdd\x0b\x83\xd8\x08\x17\xeb\x6e\x1f\x94\x5d\xd6\xdd\x7e\x29\xe2\x6a\x33\x31\xfb\x73\xb7\xe5\x48\x07\xb8\xd6\x3f\x36\xc6\xfd\xb8\x03\xa5\xec\xf5\xfd\x8a\xb7\xf7\xed\x05\x57\x3d\xb9\xe0\x2a\x3c\x9b\x24\x17\x51\x50\x53\xa8\x55\xc1\xc3\xf8\xce\x2b\x45\x2e\x5c\xaa\x84\x9b\xdd\x71\x85\xb5\x8b\xad\x62\xdc\x8c\xef\x1b\xc7\x37\x51\xec\x83\x57\xca\x75\xbd\x8a\x84\xb4\x4f\xcf\xc1\x42\xfc\xd5\x90\x23\x06\x7d\x18\x87\x58\xf0\xaf\xcc\xc0\x43\xca\xc8\x3c\x64\xce\xa5\xcb\xe0\x3d\x0a\xe1\x10\xe4\x2e\xa0\x53\xf7\x69\xd4\xdd\x5a\xeb\xc4\x97\xa2\x8e\x27\x20\x3c\x6b\xda\xb6\xe4\x3e\x3a\xcd\xa5\x6f\x0d\x47\x83\xe9\x53\x2e\x69\x92\xaa\x7d\x15\xdf\xff\x9c\xc4\xb7\x9e\x1e\x54\xfc\xda\x84\x69\x58\x5a\x87\x32\x21\x8c\x58\x5e\x0e\x8b\x97\x08\x8a\x1b\x53\xcc\x37\x09\x96\x63\xf4\x35\x62\x9f\xb8\xb6\xda\x18\xaf\xa1\xdc\x68\x17\x63\x89\xcb\x0c\xe9\x9d\xe7\x62\x5a\x50\xd0\xfa\x88\xaf\xaf\x96\xcb\xcb\xbd\x30\xa6\xd2\xaf\x2a\xbf\x4f\xed\xc0\x7e\x54\xe5\x4d\x09\xfd\xbe\x65\xa0\x37\xa5\x69\x9e\x8f\x7b\x95\x17\x97\xf4\x9b\x7b\xbd\xa9\xa7\xf3\x7c\xdc\xab\xbc\xf3\xa3\xdf\xdc\x7b\x09\x45\x80\x6a\x19\x9f\x0e\xd2\x87\x9c\xc3\x71\xc4\xe5\xcf\x5a\xd1\xe8\xf9\x39\xda\x2a\x55\x78\x1c\x1c\x7d\xd6\xf2\x4c\xcf\xcf\xd1\x56\xd9\xb4\xe3\xe0\xe8\x2e\xb5\xa6\x4e\x4e\xc0\x87\x08\x53\x44\x19\xc4\x3c\x56\x70\x7d\x59\x28\x65\x06\x81\x8f\xa8\x3b\x0b\xa0\x0f\x7e\x3c\x40\x2c\xe2\x0a\xb1\x21\x0d\xae\xee\xae\x5b\x55\x57\xa8\xdb\x1b\xbe\x94\xf3\xa4\x60\xdc\x42\xd7\x97\xa7\xaa\x12\x28\xf7\x57\x74\xa1\x2e\x7e\x7d\xad\xe5\x18\x94\x34\xd8\xaa\x58\x9a\x2c\x1d\xc7\xea\xe8\x85\xc4\xdb\xfa\x5d\x25\x75\x67\xba\xb3\x5e\x61\x5a\x21\x03\xa9\xde\xdf\x77\xf5\xaf\x66\x96\xfa\xa9\xcb\x7f\x55\x94\x73\xc8\x02\x5a\xb8\x08\xff\xd9\x00\x3f\x5c\x01\xaa\xa3\x30\x66\xb6\x34\x95\x2d\x4d\x75\x5c\xbe\x50\xae\x59\x8b\xd2\x54\x6a\x8b\x42\x6e\x0f\xc4\xca\x8a\x11\x17\x53\xd7\x63\x5c\x25\xc9\xbd\x5a\xa5\xb5\xd2\x22\x28\x1f\x31\x57\xf1\xf7\x71\x53\x14\xe1\xb4\xfa\x8b\xde\xff\x57\x45\xf5\xe9\xb9\xae\x93\x4a\xe6\x30\x0d\x11\x07\x11\x32\x4b\x3e\x47\x8b\x4f\x11\xd1\x7a\xa4\x20\xd1\xaa\x51\x45\xc6\x3f\x81\xd6\x94\xc7\xbb\xc0\x3e\x7f\x64\x86\xfd\xd9\x36\x9c\x4f\x5f\xfa\x8e\x73\x78\x96\xc3\xb0\x8c\x01\x9d\xb1\x35\x88\xd2\xbe\xd0\x36\x0c\xbd\xf3\x8e\xfb\x2e\x32\x2a\x53\xd1\xa7\x13\x71\xa6\x44\xec\xcc\x63\x14\x8c\xab\x17\xfe\xbf\x02\x00\x00\xff\xff\x48\xb9\xec\xba\x36\xfc\x00\x00") func testsGoTmplBytes() ([]byte, error) { return bindataRead( @@ -189,7 +189,7 @@ func testsGoTmpl() (*asset, error) { } info := bindataFileInfo{name: "tests.go.tmpl", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x5f, 0x9a, 0xb4, 0x7a, 0x8a, 0xe8, 0x73, 0x87, 0x92, 0x4d, 0xc3, 0x32, 0xbf, 0x22, 0xef, 0x24, 0x41, 0x61, 0x7a, 0x38, 0x1a, 0x9c, 0x2f, 0x92, 0x1c, 0x59, 0xc9, 0x50, 0x11, 0x3a, 0x19, 0x9d}} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x14, 0xb7, 0x49, 0x23, 0xb0, 0xcb, 0xab, 0xf8, 0x94, 0x3a, 0x49, 0xda, 0x3b, 0xd6, 0xcb, 0x57, 0xa4, 0xb1, 0x12, 0xad, 0xbe, 0xd6, 0xca, 0x7d, 0x4a, 0x38, 0x6e, 0x90, 0x8c, 0x8a, 0x58, 0x87}} return a, nil } diff --git a/server/gendb/gendb.go b/server/gendb/gendb.go index be8ec4c5..e8af5443 100644 --- a/server/gendb/gendb.go +++ b/server/gendb/gendb.go @@ -9,11 +9,12 @@ import ( "strings" "text/template" - "github.com/Clever/wag/v9/swagger" - "github.com/Clever/wag/v9/utils" "github.com/awslabs/goformation/v2/cloudformation/resources" "github.com/go-openapi/spec" "github.com/go-swagger/go-swagger/generator" + + "github.com/Clever/wag/v9/swagger" + "github.com/Clever/wag/v9/utils" ) //go:generate go-bindata -nometadata -ignore .*\.go$ -pkg gendb -prefix ../../server/gendb/ ../../server/gendb/ @@ -135,11 +136,10 @@ func findCompositeAttribute(config XDBConfig, attributeName string) *CompositeAt } } return nil - } // GenerateDB generates DB code for schemas annotated with the x-db extension. -func GenerateDB(packageName, basePath, goOutputPath string, s *spec.Swagger, outputPath string) error { +func GenerateDB(packageName, basePath, goOutputPath string, withTests bool, s *spec.Swagger, outputPath string) error { goOutputPath = strings.TrimPrefix(goOutputPath, ".") moduleName, versionSuffix := utils.ExtractModuleNameAndVersionSuffix(packageName, goOutputPath) var schemaNames []string @@ -206,18 +206,7 @@ func GenerateDB(packageName, basePath, goOutputPath string, s *spec.Swagger, out "GoOutputPath": goOutputPath, }, }, - { - tmplFilename: "dynamodb_test.go.tmpl", - outputFilename: path.Join(outputPath, "dynamodb/dynamodb_test.go"), - data: map[string]interface{}{ - "PackageName": packageName, - "XDBConfigs": xdbConfigs, - "OutputPath": outputPath, - "ModuleName": moduleName, - "VersionSuffix": versionSuffix, - "GoOutputPath": goOutputPath, - }, - }, + { tmplFilename: "interface.go.tmpl", outputFilename: path.Join(outputPath, "interface.go"), @@ -230,18 +219,6 @@ func GenerateDB(packageName, basePath, goOutputPath string, s *spec.Swagger, out "GoOutputPath": goOutputPath, }, }, - { - tmplFilename: "tests.go.tmpl", - outputFilename: path.Join(outputPath, "tests/tests.go"), - data: map[string]interface{}{ - "PackageName": packageName, - "XDBConfigs": xdbConfigs, - "OutputPath": outputPath, - "ModuleName": moduleName, - "VersionSuffix": versionSuffix, - "GoOutputPath": goOutputPath, - }, - }, } for _, xdbConfig := range xdbConfigs { wtis = append(wtis, writeTemplateInput{ @@ -257,6 +234,34 @@ func GenerateDB(packageName, basePath, goOutputPath string, s *spec.Swagger, out }, }) } + if withTests { + wtis = append(wtis, + writeTemplateInput{ + tmplFilename: "tests.go.tmpl", + outputFilename: path.Join(outputPath, "tests/tests.go"), + data: map[string]interface{}{ + "PackageName": packageName, + "XDBConfigs": xdbConfigs, + "OutputPath": outputPath, + "ModuleName": moduleName, + "VersionSuffix": versionSuffix, + "GoOutputPath": goOutputPath, + }, + }, + writeTemplateInput{ + tmplFilename: "dynamodb_test.go.tmpl", + outputFilename: path.Join(outputPath, "dynamodb/dynamodb_test.go"), + data: map[string]interface{}{ + "PackageName": packageName, + "XDBConfigs": xdbConfigs, + "OutputPath": outputPath, + "ModuleName": moduleName, + "VersionSuffix": versionSuffix, + "GoOutputPath": goOutputPath, + }, + }, + ) + } for _, wti := range wtis { if err := writeTemplate(wti.tmplFilename, wti.outputFilename, wti.data); err != nil { diff --git a/server/gendb/interface.go.tmpl b/server/gendb/interface.go.tmpl index f4a470fe..09b6e1bd 100644 --- a/server/gendb/interface.go.tmpl +++ b/server/gendb/interface.go.tmpl @@ -57,10 +57,11 @@ type Interface interface { // Get{{ $modelName }}sBy{{ $indexName }} retrieves a page of {{ $modelName }}s from the database. Get{{ $modelName }}sBy{{ $indexName }}(ctx context.Context, input Get{{ $modelName }}sBy{{ $indexName }}Input, fn func(m *models.{{ $modelName }}, last{{ $modelName }} bool) bool) error {{- else }} + {{- $gsiModelAttributeNames := modelAttributeNamesForIndex $xdbConfig $gsi.KeySchema }} // Get{{ $modelName }}By{{ $indexName }} retrieves a {{ $modelName }} from the database. Get{{ $modelName }}By{{ $indexName }}(ctx context.Context, - {{- range $_, $ks := $gsi.KeySchema }} - {{- varname $ks.AttributeName }} {{ goTypeForAttribute $xdbConfig $ks.AttributeName }}, + {{- range $_, $attributeName := $gsiModelAttributeNames }} + {{- varname $attributeName }} {{ goTypeForAttribute $xdbConfig $attributeName }}, {{- end -}} ) (*models.{{ $modelName }}, error) {{- end }} diff --git a/server/gendb/table.go.tmpl b/server/gendb/table.go.tmpl index f5ec6db2..d5bc7485 100644 --- a/server/gendb/table.go.tmpl +++ b/server/gendb/table.go.tmpl @@ -957,10 +957,14 @@ func (t {{ $modelName}}Table) get{{ $modelName }}sBy{{ $computedIndexName }}(ctx return nil } {{- else }} +{{- $gsiModelAttributeNames := modelAttributeNamesForIndex $xdbConfig $gsi.KeySchema }} {{- $ks := index $gsi.KeySchema 0 }} {{- $ksAttrDynamoDBType := dynamoDBTypeForAttribute $xdbConfig $ks.AttributeName }} func (t {{ $modelName}}Table) get{{ $modelName }}By{{ $computedIndexName }}(ctx context.Context, - {{- varname $ks.AttributeName }} {{ goTypeForAttribute $xdbConfig $ks.AttributeName }}) (*models.{{ $modelName }}, error) { + {{- range $_, $attributeName := $gsiModelAttributeNames }} + {{- varname $attributeName }} {{ goTypeForAttribute $xdbConfig $attributeName }}, + {{- end -}} + ) (*models.{{ $modelName }}, error) { queryInput := &dynamodb.QueryInput{ TableName: aws.String(t.TableName), IndexName: aws.String("{{ $gsi.IndexName }}"), @@ -970,7 +974,7 @@ func (t {{ $modelName}}Table) get{{ $modelName }}By{{ $computedIndexName }}(ctx ExpressionAttributeValues: map[string]*dynamodb.AttributeValue{ ":{{ camelize $ks.AttributeName }}": &dynamodb.AttributeValue{ {{- if eq $ksAttrDynamoDBType "S" }} - S: aws.String({{- varname $ks.AttributeName }}), + S: aws.String({{ if isComposite $xdbConfig $ks.AttributeName }}{{ compositeValue $xdbConfig $ks.AttributeName "" }}{{ else }}{{ varname $ks.AttributeName }}{{ end }}), {{- else if eq $ksAttrDynamoDBType "N" }} N: aws.String(fmt.Sprintf("%d", {{ varname $ks.AttributeName }})), {{- end }} @@ -997,8 +1001,10 @@ func (t {{ $modelName}}Table) get{{ $modelName }}By{{ $computedIndexName }}(ctx {{- end }} if len(queryOutput.Items) == 0 { return nil, db.Err{{ $modelName }}By{{ $computedIndexName }}NotFound{ - {{- pascalize $ks.AttributeName }}: {{ varname $ks.AttributeName -}} - } + {{- range $_, $attributeName := $gsiModelAttributeNames }} + {{ pascalize $attributeName }}: {{ varname $attributeName }}, + {{- end }} + } } var {{ camelize $modelName }} models.{{ $modelName }} diff --git a/server/gendb/tests.go.tmpl b/server/gendb/tests.go.tmpl index aea901f0..00ec81aa 100644 --- a/server/gendb/tests.go.tmpl +++ b/server/gendb/tests.go.tmpl @@ -1080,6 +1080,7 @@ func Get{{ $modelName }}sBy{{ $computedIndexName }}(d db.Interface, t *testing.T } {{- else }} {{- $hashKey := index $gsi.KeySchema 0 }} +{{- $hashKeyAttributes := modelAttributeNamesForKeyType $xdbConfig $gsi.KeySchema "HASH" }} func Get{{ $modelName }}By{{ $computedIndexName }}(s db.Interface, t *testing.T) func(t *testing.T) { return func(t *testing.T) { ctx := context.Background() @@ -1089,9 +1090,9 @@ func Get{{ $modelName }}By{{ $computedIndexName }}(s db.Interface, t *testing.T) {{- end }} } require.Nil(t, s.Save{{ $modelName }}(ctx, m)) - m2, err := s.Get{{ $modelName }}By{{ $computedIndexName }}(ctx, {{ range $ks := $gsi.KeySchema }}m.{{ pascalize $ks.AttributeName }},{{ end }}) + m2, err := s.Get{{ $modelName }}By{{ $computedIndexName }}(ctx, {{ range $an := $hashKeyAttributes }}{{ attributeToModelValue $xdbConfig $an "m." }},{{ end }}) require.Nil(t, err) - {{- range $attributeName := modelAttributeNames $xdbConfig }} + {{- range $attributeName := modelAttributeNames $xdbConfig }} {{- $attrGoType := goTypeForAttribute $xdbConfig $attributeName }} {{- if eq $attrGoType "strfmt.DateTime" }} require.Equal(t, m.{{ pascalize $attributeName }}.String(), m2.{{ pascalize $attributeName }}.String()) @@ -1100,7 +1101,7 @@ func Get{{ $modelName }}By{{ $computedIndexName }}(s db.Interface, t *testing.T) {{- end }} {{- end }} - _, err = s.Get{{ $modelName }}By{{ $computedIndexName }}(ctx, {{ exampleValueForAttribute $xdbConfig $hashKey.AttributeName 2 }}) + _, err = s.Get{{ $modelName }}By{{ $computedIndexName }}(ctx, {{ range $an := $hashKeyAttributes }}{{ exampleValueNotPtrForAttribute $xdbConfig $an 2 }},{{ end }}) require.NotNil(t, err) require.IsType(t, err, db.Err{{ $modelName }}By{{ $computedIndexName }}NotFound{}) }